커맨드 라인에서 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"
CMP는 두 개의 메모리 피연산자를 사용하지 않으므로 여기에 'cmp byte ptr [eax + ecx-2], [ebx + edx-1]'오류가 발생합니다. 이 중 하나를 레지스터로 이동 한 다음 다른 레지스터를 레지스터와 비교해야합니다. –
중간 레지스터를 사용하여 두 단계로 비교하십시오. 불행히도 바이트 주소 지정이 가능한 모든 레지스터를 이미 다 써 버렸습니다. – Jester
제안 사항 빈 등록을하려면 어떻게해야합니까? 처음부터 글쓰기가 유일한 방법입니까? –