2013-05-04 2 views
0

어셈블리에서 몇 가지 간단한 코드를 작성하려고하므로 더 쉽게 이해할 수 있습니다. 먼저 매개 변수를 취하는 함수를 만들고 싶습니다.어셈블리, 레지스터 및 반환 값 -m32/linux

매개 변수에 값 (예 : 문자 'A')을 추가하고 싶습니다 (ASCII 값 65). 함수는 A를 반환하지만 eax는 4 바이트를 보유하고 있으며이 문자는 1 바이트 만 필요하므로 EAX 레지스터의 AL 부분을 사용하려고합니다.

여기서 문제는이 기능을 사용할 때 작동하지 않는다는 것입니다. 4 개의 이상한 문자가 반환 값으로 사용됩니다. 왜 그 사람이 누군지 압니까? 내 코드처럼 보이는 방법

이 있습니다 :

 .globl letterprinter 
# Name:    letterprinter 
# Synopsis:   prints the character 'A' (or at least, it is supposed to) 
# C-signature:  int letterprinter(unsigned char *res); 
# Registers:  %EDX: for the argument that is supposed to get the value 
#     %EAX: for the return value(s) 
# 



letterprinter:      # letterprinter 

    pushl  %ebp    # start of 
    movl  %esp, %ebp   # function 

    movl  8(%ebp), %edx  # first argument 

    movl  $65, %dl   # the value 'A' in lowest part of edx, dl 

    movb  (%dl), %al   # moves it to the return register eax 
    jmp  exit     # ending function 

exit: 

    popl  %ebp    # popping - standard end of a function 
            # 0-byte ? should there be one? 
    ret        # return 
+1

그리고 질문은 ..? –

+0

죄송합니다, @ JensBjörnhager. 나는 지금 게시판을 업데이트했다. 내가 여기서 뭘 잘못하고 있는지 알았어? –

+1

우선 무엇을 하려는지 이해할 수 없습니다. 'I-dont-know-where'를 가리키는 포인터를 사용하고 값 65 대신 값 65 (% dl)에있는 반환 값을 사용하여 종료하십시오. 질문 응답을 원하면 발신자에게 보여주십시오. – maverik

답변

0
    .globl char 

# Name:   char 
# Synopsis:   A simplified sprintf 
# C-signature:  int sprinter(unsigned char *res, unsigned char); 
# Registers:  %EDX: first argument 
#    %EBX: second argument 
# 



char:     # char 

    pushl  %ebp   # start of 
    movl  %esp, %ebp  # function 

    movl  8(%ebp), %edx   # first argument 
    movl  12(%ebp), %eax   # second argument 


add_res: 
    movb  %al, (%edx)  # eax low gets the val at edx 
    movb  $65, (%edx)  # puts A to the string 
    jmp  exit   # jump to exit 

exit: 

    popl  %ebp   # popping standard end of function 
    movb  $0,1(%edx)  # adds the zero-byte at end      
    ret     # return 
+2

아마이 코드는 사용 끝났지 만 어떻게 실제로 자신의 질문에 대답합니까? – stakx

+0

사실, 나도 잘 모르겠지만 지금은 해결되었습니다. 숯불이 단지 1 바이트이기 때문에 내가 움직이는 대신에 (movl) 움직이는 것처럼 보입니다. 그러나 내가 잘못한 것이 있는지 확실하지 않습니다. 나는 그것을 추가하는 여러 charactehres 복용 앞에서 해결하기 위해 노력하고있어 :) –

관련 문제