如果我使用寄存器而不是内存,为什么它不打印字符?
这是代码:
mov eax,97
mov ebp,eax
call print_char
print_char:
pusha
mov eax,4
mov ebx,1
mov ecx,ebp
mov edx,1
int 80h
popa
ret
并不是您不能使用寄存器……而是您没有提供地址字符串(特别是 C 字符串,一个以空字符结尾的1个字符数组)。
对于那些不熟悉linuxint 80h
系统调用的人来说,快速的背景信息,这里是x86 上的调用约定:
System call # - eax
Parameters - ebx, ecx, edx, esi, edi, ebp
因此,您正在调用系统调用 4,即sys_write
. C签名是:
ssize_t sys_write(unsigned int fd, const char * buf, size_t count)
您可以看到第二个参数 ( ecx
) 应该是 a const char* buf
,它是一个指向字符串的指针。您正在通过97
,这肯定不是一个有效的地址,并且您可能存在段错误。
您的示例的一种快速而简单的方法,它使用堆栈来存储该单字符字符串:
print_char: # Takes char in ebp
pusha
mov eax, 4 # sys_write
mov ebx, 1 # stdout
push ebp
mov ecx, esp # buf (char on stack)
mov edx, 1 # just one character
int 80h # linux syscall
pop ebp
popa
ret
这应该将字母“a”(ASCII 97)打印到标准输出。如果你想打印一个十进制的 97,那么就像在 C 中一样,你会从printf
家族中调用一些东西,你需要在尝试将它写入之前将该十进制数字转换为字符串stdout
。
1 - 从技术上讲,这里的字符串不需要以空值结尾,因为您可以指定只打印一个字符。