目录
本文介绍顺序程序设计和分支程序设计。其中,分支程序设计又包括单分支结构、双分支结构和多分支结构。
顺序程序设计
顺序程序即不存在转移,按顺序执行代码的程序。下面是一个顺序程序的示例:将一个字节数据以十六进制数的形式显示。
.data
hex db 4bh ;待显示的字节数据
ascii db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h
db 41h,42h,43h,44h,45h,46h ;ASCII表
.code
.startup
mov bx,offset ascii
mov al,hex
mov cl,4
sar al,cl ;先显示高四位数据
xlat ;换码指令,变为了对应的ascii码
mov dl,al
mov ah,2
int 21h ;输出高位字符
mov al,hex
and al,0fh ;现在al只有低位
xlat
mov dl,al
mov ah,2
int 21h
分支程序设计
分支结构一般使用JMP和JCC指令控制。单分支结构实际上只是双分支结构中一个分支为空的情况。简单来说,即双分支结构为if-else-then结构,而单分支结构为if-then结构。
下面展示一个单分支结构的实例:返回AX的绝对值。
cmp ax,0
jge then
neg ax ;if (ax<0 ax*=-1) <-这是if 内部结构
then:mov result,ax
值得注意的是,由于JCC在条件满足时跳转,所以实际上if内部结构是在JCC不满足时执行的。因此设置JCC条件时需要注意反着来。
下面展示一个双分支结构的实例:输出BX最高位
shl bx,1 ;最高位存入CF
jc if ;CF=1,跳转到if
mov dl,'0' ;cf=0,将0送DL
jmp then ;注意跳过另外一个分支体
if: mov dl,'1'
then:mov ah,2
int 21h
编写双分支乃至多分支结构时,必须注意分支的开始点和结束点。在分支体中设置合适的JMP指令。
*多分支结构
多分支结构可以当成多个双分支结构的嵌套,但是这样过于繁琐。注意到,每个被标号的语句都有其在代码段的偏移地址。我们可以把所有标号语句的偏移地址记在数据段的一个表中,当满足不同的条件时,直接传下标到表中,跳转到不同的语句。
下面展示一个多分支结构的实例:根据键盘输入的1~8数字转向8个不同的处理程序段。
.model small
.data
msg db 'Input number (1~8): ',13,10,'$'
msg1 db 'Chapter1: Fundamentals of assembly language',13,10,'$'
msg2 db 'Chapter2: 8086 instruction set',13,10,'$'
msg3 db 'Chapter3: Statements of assembly language',13,10,'$'
msg4 db 'Chapter4: Basic assembly language programming',13,10,'$'
msg5 db 'Chapter5: Advanced assembly language programming',13,10,'$'
msg6 db 'Chapter6: 32-bit instructions and programming',13,10,'$'
msg7 db 'Chapter7: Mixed pprogramming with C/C++',13,10,'$'
msg8 db 'Chapter8: FP instructions and programming',13,10,'$'
table dw disp1,disp2,disp3,disp4,disp5,disp6,disp7,disp8
.stack
.code
.startup
start1:mov dx,offset msg ;提示输入数字
mov ah,9
int 21h
mov ah,1
int 21h ;等待按键
cmp al,'1'
jb start1 ;非法输入,重新输入
cmp al,'8'
ja start1 ;非法输入,重新输入
and ax,000fh ;ascii码转换为数值
dec ax
shl ax,1 ;AX*2,转化为数组下标(字单元偏移量要两倍)
mov bx,ax
jmp table[bx] ;IP<- table[bx]
start2:mov ah,9
int 21h
.exit
disp1:mov dx,offset msg1
jmp start2
disp2:mov dx,offset msg2
jmp start2
disp3:mov dx,offset msg3
jmp start2
disp4:mov dx,offset msg4
jmp start2
disp5:mov dx,offset msg5
jmp start2
disp6:mov dx,offset msg6
jmp start2
disp7:mov dx,offset msg7
jmp start2
disp8:mov dx,offset msg8
jmp start2
end
其中,jmp指令也可以换成call table[bx],并且将所有处理程序中最后的JMP指令改为RET指令。
总结
汇编语言所有的分支结构和高级语言类似,可以很好的通过高级语言的分支结构理解。但是在实际编写程序时需要注意一些汇编语言和高级语言特性的些微差别,尤其是在 多分支结构中。