어셈블리에서 몇 가지 간단한 코드를 작성하려고하므로 더 쉽게 이해할 수 있습니다. 먼저 매개 변수를 취하는 함수를 만들고 싶습니다.어셈블리, 레지스터 및 반환 값 -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
그리고 질문은 ..? –
죄송합니다, @ JensBjörnhager. 나는 지금 게시판을 업데이트했다. 내가 여기서 뭘 잘못하고 있는지 알았어? –
우선 무엇을 하려는지 이해할 수 없습니다. 'I-dont-know-where'를 가리키는 포인터를 사용하고 값 65 대신 값 65 (% dl)에있는 반환 값을 사용하여 종료하십시오. 질문 응답을 원하면 발신자에게 보여주십시오. – maverik