2013-03-19 3 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 문자열, null로 끝나는 주소를 제공하지 않는 것을의 1 문자 배열). 리눅스에서 int 80h system calls에 익숙하지 않은 사람들을 위해

빠른 배경 정보를 원하시면, 여기 86에 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을 전달 중입니다. 이는 유효한 주소가 아니며, 아마도 seg-faulting 일 것입니다.

하나 - 문자열을 저장하기 위해 스택을 사용하여 예를 들어 더러운 빠른 및-방법 :

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에 쓰려고하기 전에 10 진수를 문자열로 변환해야합니다.


1 - 당신은 단지 하나 개의 문자 인쇄를 지정할 수 있기 때문에 기술적으로 문자열은 여기 null로 종료 할 필요는 없습니다.

관련 문제