注册 登录
编程论坛 汇编论坛

我写的输入两个数相加,然后输出结果!不知道哪里出问题了

明明白白 发布于 2012-05-20 21:38, 1118 次点击
data segment

    infor1 db "Please inout the firstdata(<10):$"
    infor2 db 0ah,0dh,"Please inout the second data(<10):$"
    infor3 db 0ah,0dh,"The result is(<10):$"

data ends

code segment

    assume ds:data,cs:code
start:  mov ax,data
    mov ds,ax
   
    lea dx,infor1
    mov ah,09h
    int 21h   

    mov ah,01h
    int 21h
    sub al,30h

    mov bl,al
    lea dx,infor2
    mov ah,09h
    int 21h
    mov ah,01h
    int 21h
    sub al,30h
   
    xor ah,ah
    add al,bl
    aaa
   
    lea dx,infor3
    mov ah,09h
    int 21h
   
    push ax
    mov dl,ah
    add dl,30h
    mov ah,02h
    int 21h
    pop ax
   
    push ax
    mov dl,al
    add dl,30h
    mov ah,02h
    int 21h

    mov ah,4ch
    int 21h
code ends
    end start
15 回复
#2
zklhp2012-05-20 21:46
我也不知道~
#3
于祥2012-05-21 13:00
程序代码:
data segment

    infor1 db "Please inout the firstdata(<10):$"
     infor2 db 0ah,0dh,"Please inout the second data(<10):$"
     infor3 db 0ah,0dh,"The result is(<10):$"

data ends

code segment

    assume ds:data,cs:code

 start:  mov ax,data
     mov ds,ax
   
    lea dx,infor1
     mov ah,09h
     int 21h   

    mov ah,01h
     int 21h
     sub al,30h

    mov bl,al
     lea dx,infor2
     mov ah,09h
     int 21h
     mov ah,01h
     int 21h
     sub al,30h
   
    xor ah,ah
     add al,bl
     aaa//多余的吧?
   
    lea dx,infor3
     mov ah,09h
     int 21h   //int 21h后al的值改变了
   
    push ax     //这里时,al的值已经改变,你可以单步执行看看
     mov dl,ah
     add dl,30h
     mov ah,02h
     int 21h
     pop ax
   
    push ax    //这里多余的吧?
     mov dl,al
     add dl,30h
     mov ah,02h
     int 21h   //到这里

    mov ah,4ch
     int 21h

 code ends
     end start


看下面的



data segment

    infor1 db "Please inout the firstdata(<5):$"           //这里小于5吧?
     infor2 db 0ah,0dh,"Please inout the second data(<5):$"
     infor3 db 0ah,0dh,"The result is(<10):$"

data ends

code segment

    assume ds:data,cs:code

 start:  mov ax,data
     mov ds,ax
   
    lea dx,infor1
     mov ah,09h
     int 21h   

    mov ah,01h
     int 21h
     sub al,30h

    mov bl,al
     lea dx,infor2
     mov ah,09h
     int 21h
     mov ah,01h
     int 21h
     sub al,30h
   
     xor ah,ah
     add al,bl
     mov cl,al//用cl存储al的值
   
     lea dx,infor3
     mov ah,09h
     int 21h
   
   
     mov dl,cl
     add dl,30h
     mov ah,02h
     int 21h
   

    mov ah,4ch
     int 21h

 code ends
     end start  
#4
有容就大2012-05-25 13:05
回复 3楼 于祥
两个相加的数不能大于5 那 8+9= 17 或者 两个两位数相加怎么写?
#5
于祥2012-05-25 20:50
回复 4楼 有容就大
那就用到调整压缩的BCD码指令了!
#6
有容就大2012-05-25 21:38
回复 5楼 于祥
哦 这个还很陌生 从没用过
网上看了下 貌似这个简单的两数相加功能写一段汇编代码都比较长啊。
#7
zklhp2012-05-26 13:37
对啊 没有printf 光输出就是个问题
#8
有容就大2012-05-26 14:32
回复 7楼 zklhp
printf汇编 现在还不会编
#9
于祥2012-05-26 19:47
哈哈
#10
nulicaoliang2012-06-17 14:05
看帖回贴  新手一个
#11
heliang62912012-06-28 14:58
这个问题很简单,但是刚刚回答了5、6个帖子的问题,有点累了。我休息下。
#12
霸王怒10012012-07-01 18:38
看帖回贴  新手一个
#13
aryh2012-07-03 23:03
Please inout the second data(<10):$

其实我看了这么多,最明显的错误就是这个inout ,应该是input吧,哈
#14
heliang62912012-07-04 23:24
    push ax
    mov dl,ah
    add dl,30h
    mov ah,02h
    int 21h
    pop ax
   
    push ax
    mov dl,al
    add dl,30h
    mov ah,02h
    int 21h

===========================
这里错了。两个10以内的数字相加,如果在确保输入正确(没有退格键输入等其他错误输入,一次性完全正确输入的情况下),那么结果肯定小于255,也就是说完全能存放在AL寄存器里,但结果可能大于等于10,
而你    push ax
    mov dl,ah
    add dl,30h
    mov ah,02h
    int 21h
    pop ax
这段代码中,AH自然为0,所以显示输出为0,没有问题,但是。。。。
    push ax
    mov dl,al
    add dl,30h
    mov ah,02h
    int 21h
这段代码中,你只能保证AL的十进制数值小于10,才正确,一旦大于等于10,你这样直接调用就不对了。举例来说,当你是6+4时,AL=10D,那么也就是0Ah,此时,DL也等于0AH,再加30H,此时为3AH,3AH不是任何数字的ASCII码。
这下,你修改自己去修改,贫僧已经帮你指出问题所在了。

当然了,你的程序而且还没判断输入错误的情况,只能在确保输入一次性正确的情况下才能使用你的程序,这也需要改进。
#15
heliang62912012-07-04 23:25
6天前,我已经来占了个位了,看你自己本人还是没反应,还是我主动点帮你指出问题好了。
哎。
真累啊。
#16
heliang62912012-07-04 23:27
对了,错误不止刚才提到的,前面也有错误,已经有朋友帮你指出来了。
1