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

三个数之和

xiaxin 发布于 2008-11-18 23:03, 1073 次点击
求三个数之和。
DATA  SEGMENT
         BUF  DW        1234H,2345H,3456H
         SUM  DW        ?
DATA  ENDS
CODE SEGMENT
    ASSUME  CS:CODE, DS:DATA
     START: mov  ax, DATA;数据首地址
                  mov  dx, ax
                   mov  si, offset BUF
                   mov  di, offset SUM
                   call SUM1
                   mov  ah, 4ch
                   int  21h
       SUM1     proc
                mov cl, 3
                  xor  ax, ax
                 mov ax, [si]
  NEXT:  add  si, 2
               add  ax,[si]
               loop NEXT
                mov  [di], ax
                mov   al,byte ptr[di+1];取高字节,为转换为ASCII准备
                call  dip
                mov   al,byte ptr[di];取低字节
                call  dip
                   ret
      SUM1  ENDP
    dip  proc
                mov bl,al    ;保存al的数据
                and al, 0f0h ;取高4位
                mov cl, 04h
                shr al, cl
                cmp al, 09   ;高四位与9比较
                ja  aa1      
                add al,30h     ;小于10的加30h
                jmp bb1      ;无条件跳转到bb
            aa1: add al,37h   ;大于10,为十六进制,加37h
            bb1: mov  dl, al  ;显示高字节
                 mov  ah, 02h  
                int 21h
                mov al, bl   
                and al,0fh   ;读取低字节
                cmp al, 09h
                ja aa2  
                add al, 30h
                jmp  bb2
            aa2: add al, 37h
            bb2: mov dl,al
                 mov ah,02h
                 int 21h
                 ret
             dip endp
               
CODE ENDS
     END START
             这段程序反汇编时为什么  只执行到mov  [di], ax呢,输出结果也是错的,错在哪里?
5 回复
#2
cnhanxiao2008-11-19 00:59
回复 1# 的帖子
mov cl, 3      ;为什么要循环三次?还用的是CL?
        xor  ax, ax    ;多余指令
        mov ax, [si]
  NEXT: add  si, 2
        add  ax,[si]
        loop NEXT
问题大概在这里。循环3次?还有,loop以cx为循环,ch里是什么呢?
mov cx,2
试试。还有问题,留贴,明天我再仔细看,困死了。。。

[[it] 本帖最后由 cnhanxiao 于 2008-11-19 01:08 编辑 [/it]]
#3
xiaxin2008-11-19 16:09
DATA  SEGMENT
         BUF  DW        1234H,2345H,3456H
         SUM  DW        ?
DATA  ENDS
CODE SEGMENT
   ASSUME  CS:CODE, DS:DATA
   START:       mov  ax, DATA;数据首地址
                mov  dx, ax
                mov  si, offset BUF
                mov  di, offset SUM
                mov cx, 2
                mov ax, [si]
   NEXT:        add  si, 2
                add  ax,[si]
                loop NEXT
                mov  [di], ax
                mov   al,byte ptr [di+1];取高字节,为转换为ASCII准备
                call  dip
                mov   al,byte ptr [di];取低字节
                call  dip
                mov  ah, 4ch
                int  21h
 dip  proc
                mov bl,al    ;保存al的数据
                and al, 0f0h ;取高4位
                mov cl, 04h
                shr al, cl
                cmp al, 9   ;高四位与9比较
                ja  aa1      
                add al,30h     ;小于10的加30h
                jmp bb1      ;无条件跳转到bb
            aa1: add al,37h   ;大于10,为十六进制,加37h
            bb1: mov  dl, al  ;显示高字节
                mov  ah, 2
                int  21h
                mov al, bl   
                and al,0fh   ;读取低字节
                cmp al, 9
                ja aa2  
                add al, 30h
                jmp  bb2
            aa2: add al, 37h
            bb2: mov dl,al
                 mov ah,2
                 int 21h
                 Ret
    dip endp
               
 CODE ENDS
     END START
把上面的程序改为它后,进行反汇编为:
-u
0B97:0000 B8960B        MOV     AX,0B96
0B97:0003 8BD0          MOV     DX,AX
0B97:0005 BE0000        MOV     SI,0000
0B97:0008 BF0600        MOV     DI,0006
0B97:000B B90200        MOV     CX,0002
0B97:000E 8B04          MOV     AX,[SI]
0B97:0010 83C602        ADD     SI,+02
0B97:0013 0304          ADD     AX,[SI]
0B97:0015 E2F9          LOOP    0010
0B97:0017 8905          MOV     [DI],AX
0B97:0019 8A4501        MOV     AL,[DI+01]
0B97:001C E80900        CALL    0028
0B97:001F 8A05          MOV     AL,[DI]
无论数据为多少,输出结果总是5ACC
为什么会使这种情况呢?
#4
ONEPROBLEM2008-11-19 21:16
LZ,你的程序正常啊?
就是有一个小地方要修改一下而已:
DATA  SEGMENT
         BUF  DW        1234H,2345H,3456H
         SUM  DW        ?
DATA  ENDS
CODE SEGMENT
   ASSUME  CS:CODE, DS:DATA
   START:       mov  ax, DATA;数据首地址
                mov  dx, ax ;应该是mov ds,ax
                mov  si, offset BUF
                mov  di, offset SUM
                mov cx, 2
                mov ax, [si]
   NEXT:        add  si, 2
                add  ax,[si]
                loop NEXT
                mov  [di], ax
                mov   al,byte ptr [di+1];取高字节,为转换为ASCII准备
                call  dip
                mov   al,byte ptr [di];取低字节
                call  dip
                mov  ah, 4ch
                int  21h
dip  proc
                mov bl,al    ;保存al的数据
                and al, 0f0h ;取高4位
                mov cl, 04h
                shr al, cl
                cmp al, 9   ;高四位与9比较
                ja  aa1      
                add al,30h     ;小于10的加30h
                jmp bb1      ;无条件跳转到bb
            aa1: add al,37h   ;大于10,为十六进制,加37h
            bb1: mov  dl, al  ;显示高字节
                mov  ah, 2
                int  21h
                mov al, bl   
                and al,0fh   ;读取低字节
                cmp al, 9
                ja aa2  
                add al, 30h
                jmp  bb2
            aa2: add al, 37h
            bb2: mov dl,al
                 mov ah,2
                 int 21h
                 Ret
    dip endp
               
CODE ENDS
     END START
#5
xiaxin2008-11-22 23:46
"循环3次?还有,loop以cx为循环,ch里是什么呢?"需要说明的是我只占用cl并给它赋值为2,ch根本就没有使用。
#6
zklhp2008-11-23 08:18
xiaxin 在 2008-11-22 23:46 的发言:

"循环3次?还有,loop以cx为循环,ch里是什么呢?"需要说明的是我只占用cl并给它赋值为2,ch根本就没有使用。


要是ch里本来有数据怎么办?最好是一块赋值或用其他循环的方法
1