汇编语言学习09:顺序结构和分支结构设计

目录

顺序程序设计

分支程序设计

*多分支结构

总结


本文介绍顺序程序设计和分支程序设计。其中,分支程序设计又包括单分支结构、双分支结构和多分支结构。

顺序程序设计

顺序程序即不存在转移,按顺序执行代码的程序。下面是一个顺序程序的示例:将一个字节数据以十六进制数的形式显示。

.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指令。

总结

汇编语言所有的分支结构和高级语言类似,可以很好的通过高级语言的分支结构理解。但是在实际编写程序时需要注意一些汇编语言和高级语言特性的些微差别,尤其是在 多分支结构中。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值