gpt4 book ai didi

我们可以在程序集中将局部变量压入堆栈吗

转载 作者:太空宇宙 更新时间:2023-11-04 01:08:59 26 4
gpt4 key购买 nike

我做了一个简单的程序,它只会推送一个数字并将其显示在屏幕上,但是不知道出了什么问题

section .data
value db 10

section .text
global main
extern printf
main:
push 10 //can we push value directly on stack?
call printf
add esp,4
ret

获取上述的段错误。

section .data
value db 10

section .text
global main
extern printf
main:
push [value]
call printf
add esp,4
ret

在第二个版本中,会将值变量指向的值压入堆栈

但是得到“未指定操作大小”

最佳答案

是的,您可以将任何 DWORD 值(在 32 位汇编程序中)压入堆栈。

第一个代码片段中的问题是 printf 期望第一个参数是格式字符串(在 C 中,你会写 printf("%d\n", 10 );)。所以像

 section .data
fmt db "%d", 10, 0

...
push 10
push fmt
call printf
add esp, 8

会起作用。

在第二个代码片段中,您应该编写 push dword [value] 而不是 push [value],但是如果您的 value 变量是一个单字节。将其声明为 DWORD (dd),或执行

movsx eax, byte [value] ; if it's a signed integer; movzx for unsigned
push eax

还有一件事。调用 printf(或任何 C 库函数)时,请注意堆栈对齐。一些平台要求堆栈在函数调用时是 16 字节对齐的(这是正确执行优化的 CPU 指令(如 SSE)所必需的)。因此,要使堆栈对齐:

push ebp
mov ebp, esp
sub esp, 8 ; reserve 8 bytes for parameters
and esp, -16 ; align the stack (the reserved space can increase)
mov dword [esp], fmt ; put parameters into stack
mov dword [esp+4], 10
call printf
mov esp, ebp ; restore stack
pop ebp

关于我们可以在程序集中将局部变量压入堆栈吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16999188/

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