汇编语言比较三个数大小

程序比较简单比较短希望大神能看完。注释是后加的便于你们理解
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是刚才才改的。。其他的还没来得及改

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

  错误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:

温馨提示:内容为网友见解,仅供参考
无其他回答

怎样用汇编语言完成3个个位数的比较大小
(1)如果三个数都不相等则显示ALL NOT EQU;(2)如果三个数有两个数相等则显示TWO EQU;(3)如果三个数都相等,则显示ALL EQU。程序:data segment string1 db 16 dup(?)string2 db 16 dup(?)string3 db 16 dup(?)string4 db 'ALL NOT EQU'string5 db 'TWO EQU'string6 db...

怎样用汇编语言实现比较三个数的大小?
(1)如果三个数都不相等则显示ALL NOT EQU;(2)如果三个数有两个数相等则显示TWO EQU;(3)如果三个数都相等,则显示ALL EQU。程序:data segment string1 db 16 dup(?)string2 db 16 dup(?)string3 db 16 dup(?)string4 db 'ALL NOT EQU'string5 db 'TWO EQU'string6 db...

51汇编实现比较三个数的大小并排序
51单片机实现比较三个数的大小,并将数由小到大分别存入40H、41H、42H单元中ORG 0000H AJMP MAIN ORG 0100H MAIN: MOV 30H,#98H MOV 31H,#88H MOV 32H,#78H MOV A,30H CJNE A,31H,COMP1COMP1: JC B1 CJNE A,32H,COMP2COMP2: JC A1 MOV 42H,30H MOV A,31H CJNE A,32H,A2A2: JC A3 M...

汇编语言如何编"在D1开始的单元格存放3个无符号数,将3个数比较后由大...
mov ah,d1+1 mov bl,d1+2 ;取出三个数据,放al,ah和bl cmp al,ah ;比较前两个数据,若al小于ah,则交换 jae next1 xchg al,ah ;这时al中是前两个数中的较大数 next1: cmp al,bl ;比较al和第三个数据,若al小于bl,则交换 jae next2 xchg al,bl ;这...

汇编语言比较三个数大小
答:楼主程序有三个语法错误:错误1:没有初始化段寄存器DS,ASSUME仅仅是把DSEG与DS寄存器关联,并没有把数据段的段基址存入段寄存器DS中,因此要加入语句:"MOV AX,DSEG MOV DS,AX";错误2:因为本程序中的DATE中的数据全部是8位二进制,如果把8位赋给16位的寄存器,那么寄存器高8位的数的不...

c语言中的三个数比较大小怎么写代码?
include<stdio.h> int main(){ int a,b,c,max;printf("请输入三个数:\\n");scanf("%d%d%d",&a,&b,&c);if(a>b)max=a;if(c>max)max = c;printf("三个数中最大的数为:%d",max);return 0;}

有三个数abc,要求按由大到小的顺序把它们打印出
有三个数abc,要求按由大到小的顺序把它们打印出来,用流程图这样表示:先输入a, 再输入b 。如果a >b,则出a 。再输入c, 如果a >c 则输出a ;再输入b,如果b >c ,输出b ,则a>b>c 流程图(Flow Chart):使用图形表示算法的思路是一种极好的方法,因为千言万语不如一张图。流程图在...

用传统流程图表示 有三个数abc,要求按大小顺序把它们输出
先选择一个中间值如t或者k,这里以t为例。接着依次比较a,b,c ;先比较a、b的值,若a大于b,,则用t把a和b进行交换;然后比较a、c的值,若a大于c,则用t把a和c的值进行交换;最后比较b、c的值,若b大于c,则用t把b和c的值进行交换; 接着就可以按照从小到大的顺序依次输出啊a,b...

汇编语言求三个无符号数的最大值 设从TABLE单元开始内存中有三个互不...
MOV AX, TABLE CMP AX,TABLE+2 JAE AE2 MOV AX,TABLE+2 AE2:CMP AX,TABLE+4 JAE AE3 MOV AX,TABLE+4 AE3:MOV MAX,AX 上面这段程序假设数据是16位,如果是8位,则做少量修改 AX全部改为AL TABLE+2改为TABLE+1 TABLE+4改为TABLE+2 ...

C语言3个数比较大小!
max_ab,min_ab,c);}输入三个数,判断前两个数,将大的数赋值给max_ab,小的数赋值给min_ab,再将max_ab与c作比较。若c大于等于max_ab,则输出c,max_ab,min_ab.若c小于max_ab且大于min_ab,则输出max_ab,c,min_ab.若c小于min_ab,则输出max_ab,min_ab,c 知识延展:C语言是一种计算机...

相似回答