| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1071 人关注过本帖
标题:三个数之和
只看楼主 加入收藏
xiaxin
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-10-21
收藏
 问题点数:0 回复次数:5 
三个数之和
求三个数之和。
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呢,输出结果也是错的,错在哪里?
搜索更多相关主题的帖子: 之和 
2008-11-18 23:03
cnhanxiao
Rank: 2
等 级:新手上路
威 望:4
帖 子:124
专家分:0
注 册:2008-10-17
收藏
得分:0 
回复 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]]

还有绑架成版主的?拒绝做版主——对不起啊!
2008-11-19 00:59
xiaxin
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-10-21
收藏
得分:0 
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
为什么会使这种情况呢?
2008-11-19 16:09
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
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
2008-11-19 21:16
xiaxin
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-10-21
收藏
得分:0 
"循环3次?还有,loop以cx为循环,ch里是什么呢?"需要说明的是我只占用cl并给它赋值为2,ch根本就没有使用。
2008-11-22 23:46
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
xiaxin 在 2008-11-22 23:46 的发言:

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


要是ch里本来有数据怎么办?最好是一块赋值或用其他循环的方法
2008-11-23 08:18
快速回复:三个数之和
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.061169 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved