gpt4 book ai didi

ASM x86 FASM 中的函数参数

转载 作者:行者123 更新时间:2023-12-02 18:56:57 25 4
gpt4 key购买 nike

如何将参数传递给 Assembly 中的函数?我确实推送了最后一个参数,推送了第二个参数,推送了第一个参数..

但是我无法访问 Meh 函数中的参数..我正在做的事情使程序崩溃了..

format PE console                                ;Format PE OUT GUI 4.0
entry main

include 'macro/import32.inc'

section '.idata' import data readable ;Import Section.
library msvcrt,'msvcrt.dll'
import msvcrt, printf, 'printf',\
exit,'exit', getchar, 'getchar'

section '.data' data readable writeable ;Constants/Static Section.
InitialValue dd 0

section '.code' code readable executable
main:
push 67
push 66
push 65
call MEH

call [getchar]
mov eax, 0
ret 0

MEH:
push ebx
mov ebp, esp
sub esp, 0

mov eax, [ebp + 8] ; Trying to print first parameter..
push eax
call [printf]
add esp, eax

mov esp, ebp
pop ebx
ret

最佳答案

小附加说明。该过程的正确页眉/页脚使用push/pop ebp:

MEH:
push ebp
mov ebp, esp

mov esp, ebp
pop ebp
ret

原因是我们需要在将 ebp 寄存器用作指向参数和局部变量的指针之前保存/恢复它。

其次,CCALL 调用约定(即调用者在过程返回后恢复堆栈指针)对于 C/C++ 语言很常见,但对于汇编编程则不然。原因很明显 - 编译器可以正确计算有多少参数被插入堆栈。在手写的汇编程序中,使用这种约定会使代码不可读。

更好的方法是使用 STDCALL 调用约定:

MEH:
push ebp
mov ebp, esp

mov esp, ebp
pop ebp
retn 12 ; how many bytes to be automatically
; removed from the stack after return.

更好的做法是使用一些宏来自动创建标准过程元素,并为参数和局部变量提供人类可读的标签。例如FreshLib中提供的宏库具有以下语法:

proc MEH, .arg1, .arg2, .arg3
; define local variables here, if needed.
begin
; place your code here without headers and footers
return ; will clean the stack automatically.
endp

; pushes the arguments in the stack and call MEH
stdcall MEH, 65, 66, 67

FASM 包提供的标准宏库的语法略有不同,FASM programmers manual 对此进行了详细介绍。 .

关于ASM x86 FASM 中的函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14511516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com