那些年,我们一起学过的汇编----之顺序、分支与循环程序设计

简介:

一个算法用程序设计语言的语句有序地组合在一起加以描述,其组合方式称为程序的控制结构或简称为程序结构。程序的基本结构形式有顺序结构、分支结构和循环结构。

一、顺序结构
顺序结构是最简单的,也是最基本的程序结构形式,这种结构形式的程序的最大特点就是程序运行时从开始到结尾一直是按照编写指令的顺序执行,且每条指令仅执行一次,具有顺序结构的程序或者程序段,成为顺序程序。
我们拿一个简单的程序来说明汇编的顺序程序设计。
例:设两个字存储变量X和Y, 编程实现这两个变量的交换。
分析:由于存储单元之间不能够直接进行数据交换,所以利用通用寄存器AX来作为交换的中介。我在这里给出一个代码范例:
 
 
  1. DATA    SEGMENT 
  2.     X   DW  1032H 
  3.     Y   DW  2043H 
  4. DATA    ENDS 
  5. STACK1  SEGMENT PARA STACK 
  6.     DW   20H   DUP (0) 
  7. STACK1  ENDS 
  8. CODE    SEGMENT 
  9. ASSUME CS:CODE, DS:DATA, SS:STACK1 
  10. BEGIN:  MOV     AX, DATA 
  11.     MOV     DS, AX 
  12.     MOV AX, X 
  13.     XCHG    AX, Y 
  14.     MOV X, AX 
  15.     MOV AH, 4CH 
  16.     INT 21H  
  17. CODE    ENDS 
  18.     END 
代码分析:前面一部分是对数据以及堆栈的定义,这里我就不再多说了,我们从BEGIN开始,因为对于MOV来说,不能够直接将DATA作为源操作数,DS作为目的操作数,所以要通过一个通用寄存器来实现两者之间的赋值,MOV   AX, X意为将X的值先保存在AX中,而后执行XCHG AX, Y将AX与Y的值进行交换,此时Y里面存储的便是X的值,AX中存储的Y的值。紧接着MOV X, AX再将AX中存储的Y的值赋予X,即实现X与Y值得交换。
 
二、分支程序设计
实现分支程序需要有相应的转移指令的支持,而转移指令又分为无条件转移指令与有条件转移指令两类,在有条件转移指令中,不同的条件往往是通过标志寄存器中条件标志的不同状态反映的。因而,分支程序设计中一个至关重要的问题是如何根据标志寄存器中标志位的不同状态,配合使用合适的转移指令实现程序的转移。关于转移指令请看我的另一篇文(http://yiluohuanghun.blog.51cto.com/3407300/940123)。
 
还是拿例子来说吧:X为存储单元中的有符号字数据,编写程序实现计算其绝对值,并保存到原处。
分析:当X>=0时,X的绝对值就是它本身,否则利用求负指令将X变号,并放回要原处,下面我给出了一个程序,大家可以参考下:
 
 
  1. DATA    SEGMENT 
  2.     X   DW  0F874H 
  3. DATA    ENDS 
  4. STACK1  SEGMENT PARA    STACK 
  5.     DW  20H DUP  (0) 
  6. STACK1  ENDS 
  7. CODE    SEGMENT 
  8. ASSUME  CS:CODE, DS:DATA, SS:STACK1 
  9. BEGIN:  MOV AX, DATA 
  10.     MOV DS, AX 
  11.     MOV AX, X 
  12.     TEST    AX, AX   
  13.     JNS DONE 
  14.     NEG X   ;负指令NEG对X取反 
  15. DONE:   MOV AH, 4CH 
  16.     INT 21H 
  17. CODE    ENDS 
  18.     END BEGIN 
程序分析:TEST AX, AX;此处目的是为了重置标志寄存器各位的值,以便于下一条指令JNS使用标志寄存器
 
三、循环程序设计
在进行循环程序设计之前同分支程序设计一样,都要先知道一个基本控制指令,对于循环控制指令有如下4大类:
1、LOOP TARGET
执行的操作:先将CX<-(CX)-1,如果(CX)不等于0,则将IP指向TARGET的偏移量
2、LOOPZ/LOOPE TARGET
执行操作:先将CX<-(CX)-1,如果(CX)不等于0并且ZF=1,则将IP指向TARGET的偏移量
3、LOOPNZ/LOOPNE    TARGET
执行操作:先将CX<-(CX)-1,如果(CX)不等于0并且ZF不等于1,则将IP指向TARGET的偏移
4、JCXZ TARGET
执行操作:测试(CX)是否0,但不对CX寄存器进行修改,如果(CX)=0,那么IP指向TARGET的偏移量
 
下面还是以实例来说明问题:数据段的ARY数组中存放有10个无符号数,试找出其中最大者送入MAX单元。
分析:首先将数组中的第一个数取出放入AL,然后依次与数组中的其他元素进行比较,将较大者放入AL中,遍历数组后,AL中存放的就是最大的数。具体实现过成功如下:
 
 
  1. DATA    SEGMENT 
  2.     ARY DB  17, 5, 40, 0, 67, 12, 34, 78, 32, 10 
  3.     MAX DB  ? 
  4. DATA    ENDS 
  5. STACK1  SEGMENT PARA    STACK 
  6.     DW  20H DUP  (0) 
  7. STACK1  ENDS 
  8. CODE    SEGMENT 
  9. ASSUME  CS:CODE, SS:STACK1, DS:DATA 
  10. BEGIN:  MOV AX, DATA 
  11.     MOV DS, AX 
  12.     MOV SI, OFFSET  ARY ;SI指向ARY的第一个元素 
  13.     MOV CX, 9       ;CX作循环次数计数 
  14.     MOV AL, [SI]        ;取第一个元素到AL 
  15. LOP:    INC SI      ;SI指向后一个元素 
  16.     CMP AL, [SI]        ;比较两个数 
  17.     JAE BIGER       ;前一个元素大于后一个元素时转移 
  18.     MOV AL, [SI]        ;取较大数到AL 
  19. BIGER:  LOOP    LOP     ;(CX)不等于0 则转移 
  20.     MOV MAX, AL 
  21.     MOV AH, 4CH 
  22.     INT 21H 
  23. CODE    ENDS 
  24.     END BEGIN 
以上就介绍着三种程序设计方式。在我们的下一篇我们就开始我们的子程序设计专题了。
 
 
     本文转自 驿落黄昏 51CTO博客,原文链接:http://blog.51cto.com/yiluohuanghun/940198,如需转载请自行联系原作者

相关文章
|
7月前
|
数据处理
MCS-51单片机汇编语言程序设计
MCS-51单片机汇编语言程序设计
193 0
|
7月前
|
C语言
【汇编语言实战】用循环求N个自然数之和
【汇编语言实战】用循环求N个自然数之和
37 2
第五章 汇编语言程序设计【微机原理】2
第五章 汇编语言程序设计【微机原理】2
265 0
第五章 汇编语言程序设计【微机原理】2
第五章 汇编语言程序设计【微机原理】1
第五章 汇编语言程序设计【微机原理】1
100 0
|
机器学习/深度学习 算法 数据格式
【微机原理笔记】第 4 章 - 8086 汇编语言程序设计
【微机原理笔记】第 4 章 - 8086 汇编语言程序设计
510 0
汇编语言与微机原理实验一、实验二、实验三:分支程序设计/循环程序设计/子程序设计
汇编语言与微机原理实验一、实验二、实验三:分支程序设计/循环程序设计/子程序设计
195 0
|
存储
微机原理之指令系统和汇编程序设计
### **8086 CPU的七种寻址方式** 8086 CPU寻址方式 •8086中,CS、DS、ES和SS段寄存器在程序运行过程中分别指向当前的代码段、数据段、附加段和堆栈段。而操作数可能存放在代码段中,也可能存放在数据段、附加段、堆栈段中,还可能存放在8086CPU内部的寄存器中。**存放操作数的内存单元相对于其所在段的段起始地址偏移量称为偏移地址或有效地址EA(Effective Address)。获得操作数所在地址的方法称为寻址方式。**在8086系统中,一般将寻址方式分为两类:一类是寻找操作数的地址;另一类是寻找要执行的下一条指令的地址,即程序寻址。 •MOV DST, SRC
295 0
微机原理之指令系统和汇编程序设计