作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
根据this paper 和一些 stackoverflow 帖子,argc 在堆栈的顶部,argv 在它下面。我已经尝试了大约 3-4 种不同的方法:
printf
完成输出。sys_write()
有人在论坛上告诉我 argc 和 argv 不在堆栈中,我不明白;其他人是如何使用类似代码做到这一点的?
这是我尝试过的一个例子(3 天的知识值(value) - 尽量不要傻笑):
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
解决方法: 节.data msg db 值:%d\n
section .text
global main
extern printf
main:
push dword[esp+4]
push msg
call printf
add esp,8
mov eax,0
ret
最佳答案
获取 argc
的过程对我来说看起来没问题(对于 32 位 Linux 机器),尽管你少了 4 个字节,因为堆栈顶部很可能包含返回地址调用 main
的启动代码。
此外,sys_write
系统调用需要一个指向 ecx
中字符串的指针。你给它的是一个指向整数的指针,这不是一回事。
如果你想打印 argc
的值,你必须将它转换为字符串优先(或使用 printf
函数)。
下面是一些示例代码(我使用的是 GNU 汇编程序,因为我在这台机器上没有 NASM):
format: .asciz "%d\n"
.text
.globl main
.type main, @function
main:
pushl 4(%esp) # push argc
pushl $format # push the format string
call printf
addl $8,%esp # pop the arguments
movl $0, %eax # return value
ret
关于linux - 从堆栈中弹出和打印 argc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16036956/
我是一名优秀的程序员,十分优秀!