汇编语言的分支程序设计:
例题1:比较三个无符号数的大小,按照从大到小的顺序排列
关键的语句是:无符号数,因此所用语句是JAE实现跳转:
此外比较两个操作数所用的是CMP,交换两个操作数的是XCHG
书上的代码:
代码1:这样写法比较占用寄存器,但是寄存器之间交换数值比较快
;程序名称:实现三个无符号数的由小到大的排序 DATAS SEGMENT BUFFER DB 87,234,123 DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX MOV SI,OFFSET BUFFER;把buffer的 偏移量交给变址寄存器SI MOV AL,[SI] MOV BL,[SI+1] MOV CL,[SI+2] CMP AL,BL ;比较AL,和BL的大小 JAE NEXT1 ;如果AL>BL转移到next1 XCHG AL,BL;交换AL,和BL NEXT1: CMP AL,CL ;比较AL和CL的大小 JAE NEXT2 XCHG AL,CL NEXT2: CMP BL,CL JAE NEXT3 XCHG BL,CL NEXT3: MOV [SI],AL MOV [SI+1],BL MOV [SI+2],CL MOV AH,4CH INT 21H CODES ENDS END START
代码2:这样的写法只用了AL,但是寄存器与存储器操作数指教的操作比较慢
1 ;程序功能,实现三个数的大小排序 2 DATAS SEGMENT 3 BUFFER DB 87,234,123 4 DATAS ENDS 5 6 7 CODES SEGMENT 8 ASSUME CS:CODES,DS:DATAS 9 START: MOV AX,DATAS 10 MOV DS,AX 11 12 MOV SI,OFFSET BUFFER 13 MOV AL,[SI] 14 CMP AL,[SI+1] 15 JAE NEXT1 16 XCHG AL,[SI+1] 17 MOV [SI],AL 18 NEXT1: CMP AL,[SI+2] 19 JAE NEXT2 20 XCHG AL,[SI+2] 21 MOV [SI+1],AL 22 NEXT2: MOV AL,[SI+1] 23 CMP AL,[SI+2] 24 JAE NEXT3 25 XCHG AL,[SI+2] 26 MOV [SI+1],AL 27 NEXT3: MOV AH,4CH 28 INT 21H 29 CODES ENDS 30 END START
例题2:写一个实现一位十六进制的数转换为对应的ASCII码的程序
;程序功能,实现16进制数值转换成对应的ASCII码
;原理:但十六进制数值为0到9的时候,对应的ASCII=x+30H
;
当十六进制为10到15的时候,对应的ASCII = x+37H
这里关键的语句是 JA,大于9的话,转移
之后便是程序跳转指令:JMP,但标号很多的时候,可以用LAB1,LAB2,LAB3这种类型的标号
1 ;程序功能,实现16进制数值转换成对应的ASCII码 2 ;原理:但十六进制数值为0到9的时候,对应的ASCII=x+30H 3 ; 当十六进制为10到15的时候,对应的ASCII = x+37H 4 DATAS SEGMENT 5 XX DB 4 6 ASCII DB ? 7 DATAS ENDS 8 ; 9 10 CODE SEGMENT 11 ASSUME CS:CODE,DS:DATAS 12 MOV AX,DATAS 13 MOV DS,AX 14 15 START: MOV AL,XX 16 AND AL,0FH 17 CMP AL,9 18 JA LAB1 19 ADD AL,30H 20 JMP LAB2 21 LAB1: ADD AL,37H 22 LAB2: MOV ASCII,AL 23 MOV AH,4CH 24 INT 21H 25 CODE ENDS 26 END START
例题3:写一个程序实现ASCII转换成对应的十六进制
1 ;ASCII 转换为16进制数 2 DATA SEGMENT 3 XX DB ? 4 ASCII DB ‘a‘ 5 DATA ENDS 6 ; 7 8 CODE SEGMENT 9 ASSUME CS:CODE,DS :DATA 10 START: MOV AX,DATA 11 MOV DS,AX 12 MOV AL,ASCII 13 CMP AL,0 14 LAB: JB LAB5 15 MOV AH,AL 16 SUB AH,‘0‘ 17 CMP AL,‘9‘ 18 JBE LAB6 19 CMP AL,‘A‘ 20 JB LAB5 21 MOV AH,AL 22 SUB AH,‘A‘ -10 23 CMP AL,‘F‘ 24 JBE LAB6 25 CMP AL,‘a‘ 26 JB LAB5 27 MOV AH,AL 28 SUB AH,‘a‘ -10 29 CMP AL,‘f‘ 30 JBE LAB6 31 ; 32 LAB5 : MOV AH,-1 33 LAB6: MOV XX,AH 34 MOV AH,4CH 35 INT 21H 36 CODE ENDS 37 END START
利用地址表实现多向分支
当要根据某个变量的值,进行多种不同的处理时,就会产生了多向分支,多向分支在高级语言中常常用switch实现,在汇编语言中是使用地址表实现的
DSEG SEGMENT
……………………
COMTAB DW COMA,COMB,COMC,COMD
DW COME,COMF,COMG,COMH
DSEG ENDS
……………………
计算如果地址表内的地址,之后调用路口地址表即可
之后跳转指令用这个 JMP COMTAB[BX]