首先先看一个分支程序的例子:
假设X单元保存三个数:9,-6,34
做运算Y=
X^2 ,X<0
2*X+3,0<=X<10
使用了CMP比较指令
无条件转移指令JMP直接跳到标号处进行
转移指令所跳转的方向,既可以是正方向跳转,也可以向反方向跳转。例如,程序后部的指令“JNZ LET0”,标号LET0在程序的前部,因此是往回跳转。可以看出,向反方向跳转构成了循环。
1.段内直接短转移
格式: JMP SHORT OPR
执行的操作: (IP) ←(IP) +8 位位移量OPR
说明:
2.段内直接近转移
格式: JMP NEAR PTR OPR
执行的操作: (IP) ←(IP) + 16位位移量
说明:转移范围在-32768到+32767字节之间
执行的操作: (IP)←(EA)
说明:转移地址由EA单元的内容给出。其中有效地址EA值由OPR的寻址方式确定。它可以使用除立即数以外的任何一种数据寻址方式。如果是寄存器寻址,则把16位寄存器的内容送到IP寄存器中;如果指定的是存储单元中的一个字,则取出该存储单元的内容送到IP寄存器中去。转移的地址(即标号)保存在寄存器或者存储器中。
4.段间直接(远)转移
格式: JMP FAR PTR OPR
执行的操作: (IP) ←OPR的段内偏移地址,(CS)←OPR所在段的段地址
说明:
5.段间间接转移
格式: JMP DWORD PTR OPR
执行的操作: (IP) ←(EA),(CS)←(EA+2)
说明 :转移的地址存放在数据段的某双字单元中,其中低字为IP值,高字为CS值。
1.逻辑与AND
格式 : AND DST,SRC
执行的操作 : (DST) ←(DST) ^ (SRC)
功能 :目的操作数和源操作数按位相与,结果送到目的操作数。
执行的操作: (DST) ←(DST) V (SRC)
功能:目的操作数和源操作数按位相或,结果送到目的操作数。
3.逻辑非NOT
格式: NOT OPR
执行的操作: (OPR) ← (取反) (OPR)
功能:操作数取反,结果送回操作数。
4.逻辑异或XOR
格式: XOR DST,SRC
执行的操作: (DST) ←(DST) (目的操作数和源操作数按位异或)(SRC)
1. 算数移位操作
算术移位用于带符号数操作,算术左移和算术右移可分别看作带符号数乘以2^n和除以2 ^n
操作数左移,最高位移人CF,最低位补0。若CNT>1,则用CL寄存器存放次数。
操作数右移,最低位移入CF,最高位右移的同时最高位保持不变。即如果原来是0则仍为0,原来是1,则仍为1。若CNT>I,则用CL寄存器存放次数。
2.逻辑移位操作
逻辑移位可用于无符号数操作。逻辑左移或逻辑右移相当于无符号数乘以2^n或除以2 ^n。
与算术左移一样。操作数左移,最高位移人CF,最低位补0。
操作数右移,最低位移人CF,最高位补0。
注意:
无论是算术右移还是逻辑右移,用移位实现除法时,会出现余数丢失现象。
3.循环移位操作
操作数循环左移,最高位移入CF同时移人最低位。
格式 :ROL OPR, CNT
操作数循环右移,最低位移入CF同时移入最高位。
格式 : ROR OPR, CNT (与左移类似)
RCL OPR,CNT
操作数和进位一起循环左移, CF移人最低位,同时最高位移入CF。
RCR OPR, CNT
操作数和进位一起循环右移,CF移人最高位,同时最低位移人CF。
1.标志位操作指令
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