汇编语言程序设计——分支结构例1
设计目标
设计分支程序,实现下列公式计算。X、Y 为字型。假设 X 单元中保存三个数:9,-6,34,分别作判断和计算
设计思路
(1)在数据段中定义 2 个字型变量 X、Y,均为带符号数;
(2)在 X 单元中依次取出三个数分别作判断,根据 X 的大小作分支转移;
(3)采用寄存器相对寻址方式(MOV AX,X[SI]
)取出 X 的三个值;
(4)标号 OUT1 是各路分支的公共出口。
5-1.asm
;5-1.asm 用正常程序格式编写分支程序
data segment
x dw 9,-6,34
y dw 3 dup(?)
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov cx,3 ;循环3次
mov si,0
let0:
mov ax,x[si] ;取出x
cmp ax,0 ;x>=0?
jge let1 ;是,转到let1
mov bx,ax ;否,计算x*x
imul bx
jmp out1 ;跳到公共出口out1
let1:
cmp ax,10 ;x>=10?
jge let2 ;是,转到let2
sal ax,1 ;否,计算2x+3 sal(shift Arithmetic left)算术左移
add ax,3
jmp out1 ;跳到公共出口out1
let2:
mov bl,6 ;计算x/6
idiv bl ;商在al,余数在AH
out1:
mov y[si],ax ;保存Y
add si,2
dec cx ;cx-1
cmp cx,0
jnz let0 ;CX≠0转移到let0
mov ah,4ch ;cx=0,程序结束
int 21h
code ends
end start
masm 5-1;
link 5-1;
debug 5-1.exe
运行结果:
结束后:
- 1)程序中采用 CMP 比较指令对分支的条件进行判断;
- 2)根据判断的结果用条件转移指令 JGE、JNZ 等进行转移。条件满足转移到标号处执行程序,条件不满足则继续执行转移指令的下一条;
- 3)无条件转移指令 JMP 直接跳到标号处执行;
- 4)转移指令所跳转的方向,既可以是正方向跳转,也可以向反方向跳转。例如程序后部的指令 JNZ LET0,标号 LET0 在程序的前部,因此是往回跳转。可以看出,向反方向跳转构成了循环。
-
条件转移指令的格式如下:
条件转移指令操作码 OPR ; 这里的 OPR 代表标号
条件转移指令的作用是当条件满足时,转移到由标号指出的那条指令去执行,条件不满足则继续执行本转移指令的下一条。
例如
JZ LET1
,表示结果为 0 就转移到 LET1 那条指令去执行。JZ
中的 Z 是零标志 ZF,当 ZF = 1 时,表示之前的运算结果为 0。 -
更详细的转移指令参考下方链接
-