2
如果我使用寄存器而不是内存,它为什么不打印字符?为什么我不能在这里使用注册?
这里的代码:
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
如果我使用寄存器而不是内存,它为什么不打印字符?为什么我不能在这里使用注册?
这里的代码:
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字符串,一个空结束字符数组)。对于那些不熟悉int 80h
system calls在Linux上
快速背景资料,这里是在x86的calling convention:
System call # - eax
Parameters - ebx, ecx, edx, esi, edi, ebp
所以,you're calling system call 4,这是sys_write
。与c的签名是:
ssize_t sys_write(unsigned int fd, const char * buf, size_t count)
可以看到,第二个参数(ecx
)被认为是一个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 - 技术上的字符串并不需要以null终止的,因为在这里你可以指定打印一个字符。