汇编语言的分支程序设计

汇编语言的分支程序设计:

例题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
View Code

 代码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
View Code

 

例题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
View Code

 

 例题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
View Code

 

利用地址表实现多向分支

当要根据某个变量的值,进行多种不同的处理时,就会产生了多向分支,多向分支在高级语言中常常用switch实现,在汇编语言中是使用地址表实现的

DSEG    SEGMENT

……………………

COMTAB  DW  COMA,COMB,COMC,COMD

              DW  COME,COMF,COMG,COMH

DSEG      ENDS

……………………

计算如果地址表内的地址,之后调用路口地址表即可

之后跳转指令用这个 JMP   COMTAB[BX]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

汇编语言的分支程序设计,布布扣,bubuko.com

汇编语言的分支程序设计

上一篇:Java数据结构和算法之数组与简单排序


下一篇:苹果 ios 微信浏览器界面 ajax 提交带 file 的 form 总是走error方法