2011-12-05 7 views
1

외부 어셈블리 함수를 호출하는 C 프로그램을 실행하고 있습니다. 학업 목적으로 strcat을 (를) 수행하려고합니다. 두 문자열을 char * 매개 변수로 어셈블리 프로그램에 전달합니다. 나는 스택에 EBP를 밀어과 같이 EDX와 EBX에 문자열 1과 문자열 2를 할당 :루프가 예상대로 수행되지 않습니다.

mov edx, [ebp+8] 
mov ebx, [ebp+4] 

이제 나머지는 다음과 같다 :

procStr1: 
    cmp BYTE PTR [edx], 0 
    jne readStr1 
procStr2: 
    cmp BYTE PTR [ebx], 0 
    jne readStr2 
    jmp bottom 
readStr1: 
    inc edx 
    jmp procStr1 
readStr2: 
    mov BYTE PTR [edx], 'a' 
    inc edx 
    inc ebx 
    jmp procStr2 

bottom: 
    inc edx 
    mov BYTE PTR [edx], 0 
    pop ebx 
    pop edx 
    pop ebp 
    ret 

나는 단순히 추가하여 작동하는지 확인하는 테스트입니다 a는 string1의 끝 부분에 있습니다. 'hi'와 'bye'를 입력하면 C 프로그램에서 hiaaa를 인쇄합니다 (string1을 인쇄하여). 대신 나는 큰 string2가 아무리 큰데도 보통 string1 다음에 13 개의 a를 얻습니다. 상단에

push ebp 
mov ebp, esp 

: 나는

답변

3

당신이 했습니까 .. 정말 내 마음을 불허되고, 모든 입력을 부탁드립니다?

bottom: 
    inc edx  ; This inc should be removed -- edx already points one 
        ; byte beyond the ultimate copied byte. 
    mov BYTE PTR [edx], 0 
+0

한 데이터 처리가 내가 생각 그것은 단지의 (즉'INC edx' 제외) 괜찮 은데, 또한

mov edx, [ebp+8] mov ebx, [ebp+Ch] ; 0xC, not 4 -- C-language passes args right-to-left 

:

그렇다면, 당신의 인수는 이제에서 찾을 수 있습니다 올바른 위치에서 포인터를 가져 오는 문제 – Martin

+0

Visual Studio에서 컴파일 할 때 [ebp + C]를 할 때 구문 오류가 발생합니다. 그리고 오른쪽에서 왼쪽으로 두 번째 매개 변수가 먼저 스택에 푸시되었음을 의미합니까? – Rythven

+0

포스트를 편집했습니다. C는 16 진수이므로 12 (C의 값)를 사용하거나 h를 추가하십시오. 아이디어는 정확하고 구문 오류 일뿐입니다. 오른쪽에서 왼쪽으로, 예, 제 2 매개 변수는 첫 번째 매개 변수보다 먼저 푸시됩니다. 그것은 C 호출 규칙이며 가변 인수를 허용합니다. –