어셈블리 언어로 모델링 할 방정식이 있습니다. 구문 상 올바르지 만 레지스터에 잘못된 결과를 생성하는 다음 코드를 작성했습니다. 최종 결과는 DX 레지스터에 저장됩니다. I는 모델링하고 방정식은 다음어셈블리 언어 (Intel)에서 수학 방정식이 잘못 계산 됨
DX = (AX2 + (AX -1) + 2 * (AX +2))/2
다음은 인텔 마이크로 프로세서의 어셈블리 언어 코드입니다.
[org 0x0100]
jmp start
number: db 02
multiplicand: db 0
multiplier: db 0
multiResult: dw 0
squareResult: dd 0
square: mov [multiplicand], AX
mov [multiplier], AX
call multi
mov AX, [multiResult]
mov [squareResult], AX
ret
multi: mov CL, 8
mov BX, [multiplicand]
mov DX, [multiplier]
carryCheck: shr BX, 1
jnc skip
add [multiResult], BX
skip: shl BX, 1
dec CL
jnz carryCheck
ret
start: mov AX, [number]
call square
mov DX, [squareResult]
sub byte[number], 1
add DX, AX
add byte[number], 2
mov AX, [number]
mov [multiplicand],AX
mov byte[multiplier], 2
call multi
add DX, [multiResult]
shr DX, 1 ; division by 2
mov AX, 0x4c00 ;ending program
int 0x21
디버거를 사용하여 코드를 단계별 실행하면 오류가 발생한 곳을 확인할 수 없습니까? –
당신은 단지'db' 바이트 저장을 가지고 있지만'AX'와 다른 16 비트 레지스터를 읽고 쓰는 것 : collision. 'db' ==>'dw'. –
왜 어셈블리 코드에서 주석을 사용하지 않습니까? –