2013-03-19 63 views
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 

回答

3

这并不是说你不能用一个寄存器...这是你没有提供的地址的字符串(特别是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终止的,因为在这里你可以指定打印一个字符。

相关问题