ecx应该包含一个指向char缓冲区开始的指针。因此,您必须将缓冲区存储在内存中。您可以执行以下操作:
; Print 'A' character mov eax, 4 ; __NR_write from asm/unistd_32.h (32-bit int 0x80 ABI)mov ebx, 1 ; stdout filenopush 'A'mov ecx, esp ; esp now points to your charmov edx, 1 ; edx should contain how many characters to printint 80h ; sys_write(1, "A", 1); return value in EAX = 1 (byte written), or error (-errno)add esp, 4 ; restore esp if necessary
您可以
mov byte [esp], 'A'或其他任何地址(如果可以的话)覆盖堆栈中的所有内容。
或者,您可以使用一个字符数组来
section .rodata代替即时存储。
制作一个
write()系统调用与
constvoid*bufARG是些小号(像
'A')将使其返回
-EFAULT,不打印任何东西。内核仍然必须检查指针,并且系统调用将返回错误,而不是在错误的指针上引发SIGSEGV。
使用strace ./my_program
跟踪你的系统调用 实际上 做,包括返回值进行解码。



