Я только начинаю программировать на fasm / x86, и я начал с 64-битных образцов, так как моей целью для моего проекта, в котором мне понадобится сборка, является 64-битный xeon.
Я начал с PE64DEMO и модифицировал его, чтобы добавить цикл, однако он терпит неудачу после первой итерации, поскольку (из того, что я мог собрать в Интернете) функции API Windows могут изменять регистры, а не восстанавливать их. Я также читал, что должен сохранять то, что мне нужно, чтобы я сам выталкивал и выталкивал из стека, я прокомментировал push и pop, если я раскомментирую их, я получаю ошибку времени компиляции с сообщением «Ошибка: недопустимая инструкция pop eax».
Весь код файла ниже:
; Example of 64-bit PE program
format PE64 GUI
include 'win64a.inc'
entry start
section '.text' code readable executable
start:
sub rsp,8*5 ; reserve stack for API use and make stack dqword aligned
; Assembly code representing expr1 here (for instance mov [count], 0)
mov eax,10
.for_loop_check:
; Assembly code representing expr2 that jumps to .exit_for_loop when false (for instance cmp [count], TOP_VALUE / jae .exit_for_loop when expr2 is "count < TOP_VALUE"). Note that if expr2 is absent then so is the jump.
cmp eax,0
jz .exit_for_loop
;push eax
; body code here
mov r9d,0
lea r8,[_caption]
lea rdx,[_message]
mov rcx,0
call [MessageBoxA]
;pop eax
; Assembly code representing expr3 here (for instance inc [count])
dec eax
jmp .for_loop_check
.exit_for_loop:
mov ecx,eax
call [ExitProcess]
section '.data' data readable writeable
_caption db 'Win64 assembly program',0
_message db 'Hello World!',0
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
include 'api\kernel32.inc'
include 'api\user32.inc'
push rax
иpop rax
, а неeax
. - person Rudy Velthuis   schedule 07.06.2016PUSH/POP
не работает. Есть требование перед вызовом на 64-битной Windows стек выровнять по 16-байтной границе. Без PUSH/POP стек выравнивается по 16 байтам при вызове окна сообщений и т. д. При входе в start он смещается на 8 (адрес возврата в стеке). Вы вычитаете 40 из стека в начале. 48 делится на 16 без остатка. Если вы добавите PUSH, стек снова сместится на 8 - person Michael Petch   schedule 07.06.2016