ничего не выводит, что я делаю не так?
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.
А 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.
А что за зверь lea? Я так и не понял почему именно оно юзается для загрузки адреса, а некакой-нить mov
lea вычисляет на этапе выполнения, а mov на этапе компиляции, в принципе можно и на mov заменить
а почему у вас не запихивается в стек stdout? и почему у меня заработало, когда я закомментировало строку //push stdout ????????? это вообще КАК?
как не запихивается? push stdout
мм, семерочка
А версия дельфей то какая?)
все равно не понимаю, как оно вычисляет на этапе выполнения? не передается же в инструкцию символ cWritten, явно его адрес записывается в машинный код?
например команда LEA EAX, [ECX+ECX*4] загрузит в регистр EAX значение ECX * 5.
А какой смысл использовать это с константой:
Ну она грузит в регистр адрес, вычисленный по смещению, заданному вторым операндом. Можно заменить на mov, но во многих случая, придется делать mov, inc вместо одного lea
lea - load effective address instruction одна из самых гибких команд, принимает весьма много параметров, которые умеет складывать
а, то есть считает математику base+index*stride?
ерунда, lea может делать вычисления, только очень простые типа MOV EDX, [EBX + 8*EAX + 4]
Обсуждают сегодня