2014-04-25 26 views
0

我已经给出了一个计算器在8086装配中的添加,减去,乘除大十进制数字。这些数字最多可以是30位数字。我用3个数组来存放这些数字(num1,num2,result)。我一直坚持加入,因为每次运行程序时,都会显示结果数组为空(它显示一个加号和60个零),您能告诉我的代码出了什么问题吗?装配大数字计算器

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 

而且数组声明

num1 db 31 DUP(?), 127 
num2 db 31 DUP(?), 127 
result db 61 DUP(?), 127 

随着127用作标记物,其中执行数字开始和结束。

回答

0

我终于明白自己了。原来我并不需要在afteradd:部分使用DEC DI。该命令导致标记被放置两次,一个接一个,后者愚弄了应该打印结果的过程。