2016-10-28 9 views
0

저는 어셈블리가 새로 생겼고 x86에서 함수 호출과 관련하여 저의 고민을 해결하려고합니다.X86 - 함수가 정의되지 않았습니다.

read_integer: 

push ebp   
mov ebp, esp  

sub esp, 8 
mov dword [ebp-4], '0' 
mov dword [ebp-8], 0 

push ebx   
push ecx   
push edx   

.read_loop: 
mov eax, 10  
mul dword [ebp-8] 
add eax, [ebp-4] 
sub eax, '0'  
mov [ebp-8], eax 

mov eax, 3 
mov ebx, 0 
lea ecx, [ebp-4] 
mov edx, 1 
int 0x80 

cmp dword [ebp-4], 10 
jne .read_loop 

ret 

내가 call read_integer를 사용하여 read_integer 함수를 호출 할 수 있습니다 : 나는 다음과 같은 코드를 제공하고 있습니다.

.read_loop이 정의되지 않은 : 나는 call .read_loop를 사용 .read_loop에 대해 동일한 작업을 수행하려고하지만 때이 오류가 발생합니다.

내가 뭘 잘못하고 있니?

+0

당신이해야'call' 확신 :

1: jmp 2f ; f for forwards ; Whatever jmp 1b ; b for backwards 2: 

또는를? 그 모습으로'read_integer'의 로컬 부분으로 작성되었습니다. – Michael

답변

1

점이 .read_loop이면 로컬임을 의미합니다.

두 개의 글로벌 라벨로 이루어진 동일한 "스코프"내에서만 볼 수 있습니다.

global_label_1: 
    code 
.local_label 
    code 
    jne .local_label <=== no ambiguity, the label is locally defined, jumps to the label above 
global_label_2: 
    code 
.local_label <=== same name but different scope 
    code 

명명 충돌없이 다른 절차로 코드를 여러 번 복사/붙여 넣기 할 수 있기 때문에 유용합니다.

당신의 경우, 앞의 점을 제거하면 해결됩니다 : 당신은 글로벌 싶습니다.

read_loop: 
mov eax, 10 
... 
call read_loop  

편집 : 일부 어셈블러는이 같은 내부 라벨에 액세스 할 수 있도록 : call read_integer.read_loop

+0

하지만 내가 공유 한 예제에서'read_integer'는'read_loop'을 호출하지 않습니다.그 목적을 무 찌르지 않습니까? 왜냐하면 내가 이해하는 바에 따르면,'read_integer' 내부에서'read_loop'을 호출하지 않으면, 다른 곳에서 호출 할 수 없기 때문입니다. 전체 요점은 무엇입니까? –

+0

이'jne .read_loop'이 있습니다. 그게 중요해! –

+0

그 호출이'.read_loop 함수 '의 일부가 아닌가? 나는'read_integer'가 어디에서 끝나고'.read_loop'이 시작되는지 알아 내는데 문제가 있다고 생각합니다 ... –

1

.read_loopcall 에드 될 운명이되지 않습니다. 루프의 시작을 나타내는 read_integer의 로컬 레이블입니다. 당신이 read_integer의 말을 살펴 경우

당신이 볼 : 한 [ebp-4]이처럼 .read_loop로 다시 이동합니다

cmp dword [ebp-4], 10 
jne .read_loop 

을하지 이것은 당신이 쓴 경우와 비슷합니다 (10) 동일 다음 C에서 :

do { 
    // Whatever 
} while (*(ebp-4) != 10); 

는 점프 위치를 를 지정해야 어딘가에 점프 할 수합니다. 위치를 하드 코딩하는 것은 정말 불편할 것입니다. 따라서 레이블을 사용하고 어셈블러가 해당 레이블이 어느 주소에 해당하는지 파악하게하십시오.
그러나 특정 범위 내에서 일부 라벨 (예 : read_integer) 만 볼 수 있습니다. 아마도 다른 함수에서 동일한 레이블 이름을 사용할 수 있기를 원할 수도 있습니다. 또는 레이블이 함수에 대해 로컬임을 코드를 읽는 사람에게 명확하게 전달하기를 원할 수도 있습니다. 따라서 일부 어셈블러에서는 @ Jean-FrançoisFabre에 설명 된대로 로컬 레이블을 만들기위한 구문을 제공합니다.

일부 조립 한 단계 더 나아가 예 : "익명"라벨 수 : 어디에서 .read_loop``

-: 
    jp + ; this is Z80 assembly, so jp isn't a typo 
    ; Whatever 
    jp - 
+: 
관련 문제