根据这篇论文和一些stackoverflow帖子,argc在堆栈的顶部,而argv在它的下面。我已经尝试了大约 3-4 种不同的方法:
- 将其弹出到初始化变量(.data)中 - 通过调用完成输出
printf
。 - 将其弹出到未初始化的空间 (.bss) - 通过调用完成输出
sys_write()
- 上述+调整的混合。
论坛上有人告诉我argc和argv不在堆栈中,我不明白;其他人如何使用类似的代码来做这件事?
这是我尝试过的一个例子(3天的知识——尽量不要傻笑):
section .bss
argc: resd 1 ; alloc 4 bytes for popped value
section .text
global _start
_start:
pop dword[argc] ; pop argc, place in var
mov ebx,0x01 ; file descriptor = STDOUT
mov ecx,argc ; var (addr) - points to buffer
mov edx,1 ; length of buffer (single digit)
mov eax,0x04 ; syscall number for sys_write()
int 0x80 ; request the kernel to make syscall
exit:
mov ebx,0x00 ; arg for sys_exit() - sys_exit(0)
mov eax,0x01 ; syscall number for sys_exit()
int 0x80 ; request the kernel to make syscall
解决方案:section .data msg dbValue: %d\n
section .text
global main
extern printf
main:
push dword[esp+4]
push msg
call printf
add esp,8
mov eax,0
ret