0
나는 큰 십진수를 더하고, 빼고, 곱하고 나눌 8086 어셈블리에서 계산기를 만들 것을 권유 받았다. 이 번호는 최대 30 자까지 가능합니다. 나는이 배열을 저장하기 위해 3 개의 배열을 사용했다 (num1, num2, result). 나는 프로그램을 실행할 때마다 결과 배열이 비어 있다는 것을 표시하기 때문에 (더하기 기호와 60 개의 0을 표시하기 때문에) 코드에 무엇이 잘못되었는지를 알 수 있습니까?어셈블리 큰 숫자 계산기
ADDER:
MOV BP, offset num1
MOV SI, offset num2
MOV DI, offset result
MOV CL, byte ptr CS:[BP]
MOV CH, byte ptr CS:[SI]
CMP CL, CH
JZ addgood
CMP CL, '-'
JNZ svers
MOV byte ptr CS:[BP], '+'
MOV SI, offset num1
MOV BP, offset num2
JMP SUBSTRACTOR
svers:
CMP CH, '-'
MOV byte ptr CS:[SI], '+'
JMP SUBSTRACTOR
addgood:
lastdigit1:
MOV AL, byte ptr CS:[BP]
CMP AL, 127
JZ gotlastdigit1
INC BP
JMP lastdigit1
gotlastdigit1:
lastdigit2:
MOV AL, byte ptr CS:[SI]
CMP AL, 127
JZ gotlastdigit2
INC SI
JMP lastdigit2
gotlastdigit2:
MOV DI, offset result
ADD DI, 60
initialaddition:
CMP byte ptr CS:[BP], '+'
JNZ notover1
JMP num1end
notover1:
CMP byte ptr CS:[BP], '-'
JNZ notover2
JMP num1end
notover2:
CMP byte ptr CS:[SI], '+'
JNZ notover3
JMP num2end
notover3:
CMP byte ptr CS:[SI], '-'
JNZ notover4
JMP num2end
notover4:
MOV CH, byte ptr CS:[BP]
MOV CS:[DI], CH
MOV CH, byte ptr CS:[SI]
ADD CS:[DI], CH
DEC BP
DEC SI
DEC DI
JMP initialaddition
afteriniadd:
DEC DI
MOV CL, 127
MOV CS:[DI], CL
MOV DI, offset result
ADD DI, 60
truaddition:
MOV CH, 0
MOV CL, byte ptr CS:[DI]
CMP CL, 10
JNAE movealong
CALL pisdod
movealong:
MOV CS:[DI], CL
DEC DI
MOV CL, byte ptr CS:[DI]
CMP CL, 127
JZ isspecial
ADD CS:[DI], CH
JMP truaddition
isspecial:
CMP CH, 0
JZ afteradd
MOV CS:[DI], CH
afteradd:
DEC DI
MOV CS:[DI], 127
MOV SI, offset num1
MOV CL, CS:[SI]
MOV DI, offset result
CMP CL, '+'
JZ adplus
MOV byte ptr CS:[DI], '-'
JMP adminus
adplus:
MOV byte ptr CS:[DI], '+'
adminus:
RET
서브 절차
num1end:
MOV CL, '-'
CMP byte ptr CS:[SI], CL
JNZ noneed1
JMP afteriniadd
noneed1:
MOV CL, '+'
CMP byte ptr CS:[SI], CL
JNZ noneed2
JMP afteriniadd
noneed2:
MOV CL, byte ptr CS:[SI]
MOV byte ptr CS:[DI], CL
DEC DI
DEC SI
JMP num1end
;......................................
num2end:
MOV CL, '-'
CMP byte ptr CS:[BP], CL
JNZ noneed3
JMP afteriniadd
noneed3:
MOV CL, "+"
CMP byte ptr CS:[BP], CL
JNZ noneed4
JMP afteriniadd
noneed4:
MOV CL, byte ptr CS:[BP]
MOV byte ptr CS:[DI], CL
DEC DI
DEC BP
JMP num2end
pisdod:
CMP CL, 10
JGE notyet
RET
notyet:
SUB CL, 10
INC CH
JMP pisdod
어레이 선언 (127)이 자리 할 시작 및 종료 마커로서의 함께
num1 db 31 DUP(?), 127
num2 db 31 DUP(?), 127
result db 61 DUP(?), 127
.