2017-12-12 9 views
-2

커맨드 라인에서 2 개의 문자열을 취한 다음 두 번째 문자열의 첫 번째 항목을 계산하는 간단한 어셈블리 프로그램을 작성하려고합니다.
예 : x = "abc"y = "abcabc abc". 그것은 3을 인쇄해야합니다.Assembly intel x86 - compare [] []

'cmp'에 대한 메모리 참조가 너무 많아서이 코드를 컴파일 할 수 없습니다.
나는이 문제가 // 여기에 있다고 생각한다. 어떻게 해결할 수 있습니까?

.intel_syntax noprefix 
.global main 
.text 

main: 

    mov eax, [esp+4] 
    cmp eax, 3 
    je fun 

    mov eax, offset error 
    push eax 
    call printf 
    add esp, 4 
    mov eax, 0 
    ret 

fun: 

    mov eax, [esp+8] 
    mov ebx, [esp+12] 
    xor ecx,ecx 
    push edx 
    call loop 

loop_z: 

    xor edx,edx 

loop: 

    inc ecx 
    cmp byte ptr [eax+ecx-2],0 
    je end 
    cmp byte ptr [ebx+edx-1],0 
    je zer 

    jump: 


    //here 
    cmp byte ptr [eax+ecx-2],[ebx+edx-1] 
    //here 


    jne loop_z 
    inc edx 
    jmp loop 

zer: 

    pop edx 
    inc edx 
    push edx 
    xor edx,edx 
    jmp jump 

end: 

    call printf 
    add esp, 4 
    mov eax, 0 
    ret 


.data 
error: 
.asciz " 2 arg \n" 
+1

CMP는 두 개의 메모리 피연산자를 사용하지 않으므로 여기에 'cmp byte ptr [eax + ecx-2], [ebx + edx-1]'오류가 발생합니다. 이 중 하나를 레지스터로 이동 한 다음 다른 레지스터를 레지스터와 비교해야합니다. –

+1

중간 레지스터를 사용하여 두 단계로 비교하십시오. 불행히도 바이트 주소 지정이 가능한 모든 레지스터를 이미 다 써 버렸습니다. – Jester

+0

제안 사항 빈 등록을하려면 어떻게해야합니까? 처음부터 글쓰기가 유일한 방법입니까? –

답변

0

처음부터 글을 쓰는 것이 유일한 방법은 아니지만,이 경우에는 아마도 더 나은 대안 일 수 있습니다. 숙제는 언제나 문제가되며, 도움과 실제로 일을 균형있게 이뤄내려고 노력합니다.

고려하십시오.

str1 db 'We will always wonder how the will of those without a ' 
      'will can be so unwilling', 0 
str2 db 'will', 0 

IA32가 이상적으로 관심을 지불 할 작업의 종류와이 개 지침에 적합 너무 SCAS & CMPS 있습니다. 그들은 ECX, ESI & EDI의 사용을 전제로합니다.

mov  esi, str1 
    mov  edi, str2 
    mov  ecx, 74   ; Length of str1 - str2 
    xor  ebx, ebx 

참고 : 길이를 하드 코딩 했으므로 프로그램에서 ECX 값을 계산할 곳을 지정해야합니다.

이들은 작업을 수행하는 데 필요한 유일한 4 개의 레지스터입니다. 시각적으로 볼 때 우리는 하나가 다른 4 개의 사건을 볼 수 있지만 'W'는 'w'와 같지 않으므로 대문자와 소문자를 구별하는 방법을 고안해야합니다.

지침서 CMPS & SCAS를 검토하고 여러분이 생각해내는 것을보십시오.