gpt4 book ai didi

nasm - 使用 nasm 打印 `argv[]`

转载 作者:行者123 更新时间:2023-12-05 02:20:21 26 4
gpt4 key购买 nike

我正在尝试使用 nasm 打印给我的程序的命令行参数:

GLOBAL main
EXTERN printf

section .rodata
fmt db "Argument: %s", 10, 0

section .text
main:
push ebp ; push ebp0
mov ebp, esp ; [ebp1] == ebp0

push dword[ebp+8] ; push argc
call print_args

mov eax, 0 ; return(0)
mov esp, ebp ; pop
pop ebp ; stack frame
ret

print_args:
push ebp ; pusheo ebp1
mov ebp, esp ; [ebp2] == ebp1
mov edi, dword[ebp+8] ; [ebp+8] == argc
jmp lop
postlop:
mov esp, ebp
pop ebp
ret


lop:
sub edi, 1
cmp edi, 0
jz postlop
mov esi, [ebp] ; [esi] == ebp1
mov ebx, [esi + 12] ; [esi+12] = [ebp1+12] = argv[0]?
push ebx
push fmt
call printf
jmp lop

但是,这只会打印垃圾(我相信这应该打印 argv[0]argc-1 次。)

我正在编译我的代码:

nasm -f elf32 main.asm
gcc -m32 main.o -o main.out

怎么了?

顺便说一句,使用 dword[ebp+8] 可以正确获取 argc

我在 ubuntu 上运行这个。程序确实输出了 Argument: ... argc-1 次,但是 ... 是垃圾。

最佳答案

就像[epb+8]argc[esi + 12]argv,< em>即参数地址数组的地址。因此,为了找到 argv[0],您必须再次取消引用。

mov     esi, [ebp]      ; [esi] == ebp1
mov ebx, [esi + 12] ; [esi+12] = [ebp1+12] = argv
push dword [ebx] ; [ebx] = argv[0]
;^^^^^^^^^^^
push fmt
call printf

关于nasm - 使用 nasm 打印 `argv[]`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39377570/

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