有没有好的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