2014-04-25 6 views
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 

.

답변

0

나는 그것을 결국 알아 냈다. 밖으로 나는 afteradd: 부분에 DEC DI을 사용할 필요가 없습니다. 이 명령으로 마커가 차례로 두 번 배치되어 결과를 인쇄 할 프로 시저를 속였습니다.