8086汇编——分支程序的设计

一、例子

首先先看一个分支程序的例子:
假设X单元保存三个数:9,-6,34
做运算Y=

  • X^2 ,X<0

  • 2*X+3,0<=X<10

  • X/6,X>=10
    8086汇编——分支程序的设计_第1张图片
    程序分析

  • 使用了CMP比较指令

  • 无条件转移指令JMP直接跳到标号处进行

  • 转移指令所跳转的方向,既可以是正方向跳转,也可以向反方向跳转。例如,程序后部的指令“JNZ LET0”,标号LET0在程序的前部,因此是往回跳转。可以看出,向反方向跳转构成了循环。

二、转移地址的寻址

1.段内直接短转移
格式: JMP SHORT OPR
执行的操作: (IP) ←(IP) +8 位位移量OPR
说明:

  • 这种转移格式只允许在一128到+127字节的范围内转移。
  • 直接可解释成标号直接写在指令中。
    例子:
    JMP SHORT HELLO
    HELLO : MOV AL,3

2.段内直接近转移
格式: JMP NEAR PTR OPR
执行的操作: (IP) ←(IP) + 16位位移量
说明:转移范围在-32768到+32767字节之间

8086汇编——分支程序的设计_第2张图片
3.段内间接转移
格式: JMP WORD PTR OPR

执行的操作: (IP)←(EA)

说明:转移地址由EA单元的内容给出。其中有效地址EA值由OPR的寻址方式确定。它可以使用除立即数以外的任何一种数据寻址方式。如果是寄存器寻址,则把16位寄存器的内容送到IP寄存器中;如果指定的是存储单元中的一个字,则取出该存储单元的内容送到IP寄存器中去。转移的地址(即标号)保存在寄存器或者存储器中。

8086汇编——分支程序的设计_第3张图片

4.段间直接(远)转移
格式: JMP FAR PTR OPR

执行的操作: (IP) ←OPR的段内偏移地址,(CS)←OPR所在段的段地址

说明:

  • 直接写在指令中的标号的属性为FAR型。
  • 标号的偏移地址送入IP,标号的段地址送人CS。

8086汇编——分支程序的设计_第4张图片

5.段间间接转移

格式: JMP DWORD PTR OPR

执行的操作: (IP) ←(EA),(CS)←(EA+2)

说明 :转移的地址存放在数据段的某双字单元中,其中低字为IP值,高字为CS值。

8086汇编——分支程序的设计_第5张图片

三、条件转移方式

1.根据条件标志转移
8086汇编——分支程序的设计_第6张图片
2.无符号数的转移

8086汇编——分支程序的设计_第7张图片
3.带符号数比较转移
8086汇编——分支程序的设计_第8张图片
4.CX值为0的转移
8086汇编——分支程序的设计_第9张图片

四、逻辑运算

1.逻辑与AND

格式 : AND DST,SRC

执行的操作 : (DST) ←(DST) ^ (SRC)

功能 :目的操作数和源操作数按位相与,结果送到目的操作数。

8086汇编——分支程序的设计_第10张图片
2.逻辑或OR
格式: OR DST, SRC

执行的操作: (DST) ←(DST) V (SRC)

功能:目的操作数和源操作数按位相或,结果送到目的操作数。

8086汇编——分支程序的设计_第11张图片

3.逻辑非NOT

格式: NOT OPR

执行的操作: (OPR) ← (取反) (OPR)

功能:操作数取反,结果送回操作数。

4.逻辑异或XOR

格式: XOR DST,SRC

执行的操作: (DST) ←(DST) (目的操作数和源操作数按位异或)(SRC)

五、移位操作

1. 算数移位操作
算术移位用于带符号数操作,算术左移和算术右移可分别看作带符号数乘以2^n和除以2 ^n

  • SAL OPR, CNT

操作数左移,最高位移人CF,最低位补0。若CNT>1,则用CL寄存器存放次数。

  • SAR OPR,CNT

操作数右移,最低位移入CF,最高位右移的同时最高位保持不变。即如果原来是0则仍为0,原来是1,则仍为1。若CNT>I,则用CL寄存器存放次数。

2.逻辑移位操作
逻辑移位可用于无符号数操作。逻辑左移或逻辑右移相当于无符号数乘以2^n或除以2 ^n。

  • SHL OPR, CNT

与算术左移一样。操作数左移,最高位移人CF,最低位补0。

  • SHR OPR, CNT

操作数右移,最低位移人CF,最高位补0。

注意:无论是算术右移还是逻辑右移,用移位实现除法时,会出现余数丢失现象。

3.循环移位操作

  • ROL循环左移

操作数循环左移,最高位移入CF同时移人最低位。
格式 :ROL OPR, CNT
8086汇编——分支程序的设计_第12张图片

  • ROR循环右移

操作数循环右移,最低位移入CF同时移入最高位。
格式 : ROR OPR, CNT (与左移类似)

  • RCL带进位的循环左移指令

RCL OPR,CNT
操作数和进位一起循环左移, CF移人最低位,同时最高位移入CF。

  • RCR 带进位的循环右移指令

RCR OPR, CNT
操作数和进位一起循环右移,CF移人最高位,同时最低位移人CF。

六、处理及控制指令

1.标志位操作指令

8086汇编——分支程序的设计_第13张图片

2.空操作指令

格式: NOP
功能: CPU执行- -次空操作,不影响标志位。占用3个时钟周期。

3.暂停指令

格式: HLI
功能:遇到该指令CPU暂停执行。

分支程序举例

完成一个菜单程序的设计与实现,要求写出设计思路和程序源码,并用截图形式记录实验结果。菜单包含3个选项:1.计算f=3X+2Y+5 ,2.计算f=(X+6)/2Y, 3.退出。其中,X和Y是1位的十进制数,并要求X和Y从键盘输入。要求先显示菜单内容,然后根据输入的菜单项给出对应的输出或执行对应的操作。

思路:
和C的思路一样,判断转到需要的计算模块。需要注意的是余数为2位数的情况,需要再次调整,保证程序可读性,也需要增加分割线。

DATAS SEGMENT
    X DB ?
    Y DB ?
    J DB ?
    mess1 DB 'input 1 f=3x+2y+5','$'
    mess2 DB 0AH,0DH,'input 2 f=(x+6)/2y','$'
    mess3 DB 0AH,0DH,'input 3 end',0AH,0DH,'$'
    mess4 DB 0AH,0DH,'output is ','$'
    mess5 DB '......','$' ;表示余数
    mess6 DB 0AH,0DH,'dividing line',0AH,0DH,'$' ;分割线
DATAS ENDS

STACKS SEGMENT

STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    
    MOV DX,OFFSET mess1 ;输出三条字符串
    MOV AH,9
    INT 21H
    MOV DX,OFFSET mess2
    INT 21H
    MOV DX,OFFSET mess3
    INT 21H
   
 LET:
    MOV AH,9H
    MOV DX,OFFSET mess6
    INT 21H
    MOV AH,1H
    INT 21H
    SUB AL,30H
    MOV BL,AL
    MOV J,BL  
    CMP BL,3
    JGE OUT3
    INT 21H
    SUB AL,30H
    MOV X,AL 
    INT 21H
    SUB AL,30H
    MOV Y,AL
    CMP BL,2
    JGE OUT2
    CMP BL,1
    JGE OUT1
 OUT1:
   MOV CL,X  ;计算第一种情况
   MOV AL,3
   MUL CL
   MOV CX,AX
   
   MOV BH,0H
   MOV BL,Y
   ADD BL,BL
   ADD AX,BX
   ADD AL,5
   AAM
   ADD AX,3030H
   MOV BX,AX
   JMP COUT
 OUT2:
   MOV AH,0H ;计算第二种
   MOV AL,X
   ADD AL,6H
   MOV BL,Y
   ADD BL,BL
   DIV BL
   MOV BX,AX
   ADD BX,3030H
   JMP COUT
   
 COUT:
   MOV AH,9
   MOV DX,OFFSET mess4  
   INT 21H
   MOV CL,J  ;判断是否为第二种情况
   CMP CL,2
   JGE COUT2
   
   MOV AH,2
   MOV DL,BH
   INT 21H
   MOV DL,BL
   INT 21H
   JMP LET
   
 COUT2:
    MOV AH,2
    MOV DL,BL
    INT 21H
    MOV DX,OFFSET mess5 ;输出.....
    mov AH,9
    INT 21H
    
    MOV AH,0H ;处理余数为2位数的问题
    MOV AL,BH
    SUB AL,30H ;减去先加的30H
    AAM
    MOV BX,AX
    ADD BX,3030H
    MOV AH,2
    MOV DL,BH
    INT 21H
    MOV DL,BL
    INT 21H  
    JMP LET ;返回第一步
    
  OUT3:
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

8086汇编——分支程序的设计_第14张图片()

你可能感兴趣的:(8086汇编程序设计)