linux – 在没有printf的NASM中打印ARGC

有没有好的NASM /英特尔组装程序员?如果是这样,我有一个问题给你!

我可以在网上找到的每个教程都显示了“printf”的用法,用于将ARGC的实际值打印到屏幕上(fd:/ dev / stdout).是不是可以简单地用sys_write()打印它,例如:

SEGMENT .data ; nothing here

SEGMENT .text ; sauce
        global _start
        _start:
                pop ECX ; get ARGC value
                mov EAX, 4 ; sys_write()
                        mov EBX, 1 ; /dev/stdout
                        mov EDX, 1 ; a single byte
                int 0x80
                mov EAX, 1 ; sys_exit()
                        mov EBX, 0 ; return 0
                int 0x80
SEGMENT .bss ; nothing here

当我运行它时,我根本没有输出.我曾尝试将ESP复制到EBP并尝试使用byte [EBP 4],(我被告知括号取消引用内存地址).

我可以确认,当与常数相比时,该值有效.例如,
这段代码有效:

pop ebp ; put the first argument on the stack
mov ebp, esp ; make a copy 
cmp byte[ebp+4],0x5 ; does it equal 5?
je _good ; goto _good, &good, good()
jne _bad ; goto _bad, &bad, bad()

当我们“弹出”堆栈时,我们在技术上应该获得全部参数,不是吗?哦,顺便说一句,我编译:

nasm -f elf test.asm -o test.o
ld -o test test.o

不确定这是否相关.如果我需要提供更多信息或格式化我的代码以便于阅读,请告诉我.

解决方法:

至少有2个问题.

>您需要将指针传递给要打印的内容.
>您可能想要转换为文本.

这样的事情应该有效:

SEGMENT .text ; sauce
        global _start
        _start:
                mov ecx, esp        ; pointer to ARGC on stack
                add byte [esp], '0' ; convert to text assuming single digit
                mov EAX, 4 ; sys_write()
                mov EBX, 1 ; /dev/stdout
                mov EDX, 1 ; a single byte
                int 0x80
                mov EAX, 1 ; sys_exit()
                mov EBX, 0 ; return 0
                int 0x80
上一篇:linux – strlen in assembly


下一篇:linux – 在x86中将字符串定义为字节(db)和将字符串定义为单词/双字(dw / dd)之间的区别是什么