汇编语言比较三个数大小

程序比较简单比较短希望大神能看完。注释是后加的便于你们理解DSEGSEGMENTDATEDB0CH,0FH,2H;这是已知的数值DSEGENDSCSEGSEGMENTAS... 程序比较简单比较短希望大神能看完。注释是后加的便于你们理解
DSEG SEGMENT
DATE DB 0CH,0FH,2H ;这是已知的数值
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START: MOV SI,OFFSET DATE
MOV AL,[SI] ;输出的DS完全不对。即使改变了date的值也不变。。到底错在哪
MOV BL,[SI+1]
MOV CL,[SI+2]
CMP AX,BX
JA FLAG1
JMP FLAG2
FLAG1: XCHG AX,BX
FLAG2: CMP BX,CX
JA FLAG3
JMP FLAG4
FLAG3: XCHG BX,CX
FLAG4: CMP AX,BX
JA FLAG5
RET
FLAG5: XCHG AX,BX
MOV AH,4CH
INT 21H
CSEG ENDS
END START
AL,BL,CL是刚才才改的。。其他的还没来得及改
展开
 我来答
溺水的剑鱼
推荐于2017-10-03 · TA获得超过277个赞
知道答主
回答量:34
采纳率:0%
帮助的人:10.3万
展开全部

  答:楼主程序有三个语法错误:

  错误1:没有初始化段寄存器DS,ASSUME仅仅是把DSEG与DS寄存器关联,并没有把数据段的段基址存入段寄存器DS中,因此要加入语句:"MOV AX,DSEG     MOV DS,AX";

  错误2:因为本程序中的DATE中的数据全部是8位二进制,如果把8位赋给16位的寄存器,那么寄存器高8位的数的不定性会打乱本程序;

  错误3:ret指令是子程序的返回指令(本程序中无子程序),ret无法实现楼主想要的退出程序操作,可以用JMP跳转到程序的末尾退出程序。


  程序逻辑:楼主的逻辑是通过冒泡排序的方式把最大数存入CL,最小数存入AL。修改后的程序通过调试跟踪发现已实现此效果,无逻辑错误。


  图A为修改后的源程序,图B为调试过程中程序执行完毕退出前寄存器中的数据存储情况(从标注可以看到:AL中存储的是最小数,BL中存储的是中间数,CL中存储的是最大数)。


  图A:


  图B:

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式