169 похожих чатов

Здравствуйте, хочу сделать HelloWorld в консоли Дельфи, но функция API

ничего не выводит, что я делаю не так?
program Hello;
{$APPTYPE CONSOLE}
uses System.SysUtils, WinAPI.Windows;
begin
var caption: PWideChar := 'Hello';
var text: PWideChar := 'World';
var stdout: DWORD;
var cWritten:DWORD;
writeln(caption);
asm
push STD_OUTPUT_HANDLE
call GetStdHandle
mov stdout, eax
push eax
push text
push 5
push offset cWritten
push 0
call WriteConsoleA
end;
readln;
end.

20 ответов

26 просмотров

А calling convention правильный?

Sergey-Vinogradov Автор вопроса
Boris Usievich
А calling convention правильный?

push 0 push caption push text push 0 call MessageBoxW вот это работает

А если с асма на дельфи переписать то работает?

И кстати да, почему ты вайд-строку в А-функцию пихаешь?) Оно же в лучшем случае первый символ выведет, точнее его половинку, которая не нулл

program Hello; {$APPTYPE CONSOLE} uses SysUtils,Windows; var text: PWideChar; stdout: THandle; cWritten: DWORD; begin text:= 'Hello World!'; asm push STD_OUTPUT_HANDLE call GetStdHandle mov stdout, eax lea eax, cWritten push eax push 12 push text push stdout call WriteConsoleW end; readln; end.

Александр В
program Hello; {$APPTYPE CONSOLE} uses SysUtils,...

А что за зверь lea? Я так и не понял почему именно оно юзается для загрузки адреса, а некакой-нить mov

Vga
А что за зверь lea? Я так и не понял почему именно...

lea вычисляет на этапе выполнения, а mov на этапе компиляции, в принципе можно и на mov заменить

Sergey-Vinogradov Автор вопроса
Александр В
program Hello; {$APPTYPE CONSOLE} uses SysUtils,...

а почему у вас не запихивается в стек stdout? и почему у меня заработало, когда я закомментировало строку //push stdout ????????? это вообще КАК?

Александр В
screenshot

мм, семерочка

Александр В
lea вычисляет на этапе выполнения, а mov на этапе ...

все равно не понимаю, как оно вычисляет на этапе выполнения? не передается же в инструкцию символ cWritten, явно его адрес записывается в машинный код?

Vga
все равно не понимаю, как оно вычисляет на этапе в...

например команда LEA EAX, [ECX+ECX*4] загрузит в регистр EAX значение ECX * 5.

Karagy
например команда LEA EAX, [ECX+ECX*4] загрузит в р...

А какой смысл использовать это с константой:

Vga
все равно не понимаю, как оно вычисляет на этапе в...

Ну она грузит в регистр адрес, вычисленный по смещению, заданному вторым операндом. Можно заменить на mov, но во многих случая, придется делать mov, inc вместо одного lea

Sergey-Vinogradov Автор вопроса
Vga
А что за зверь lea? Я так и не понял почему именно...

lea - load effective address instruction одна из самых гибких команд, принимает весьма много параметров, которые умеет складывать

Александр В
lea вычисляет на этапе выполнения, а mov на этапе ...

ерунда, lea может делать вычисления, только очень простые типа MOV EDX, [EBX + 8*EAX + 4]

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта