第五讲.使用JCC指令构造分支与循环
assume cs:code,ds:data ;取名为code的代码段和取名为data的数据段
data segment ;数据段开始
buffer db 0DH,0AH,'rkvir$';(16位汇编特有写法)
;buffer db 'rkvir',0(32/64位写法)
data ends ;数据段结束
code segment ;代码段开始
rkmain proc ;主函数开始
mov ax,data
mov ds,ax
mov dx,offset buffer;将buffer地址传入dx
mov ah,09H
int 21H ;将字符串显示出去
mov ah,07H;键盘输入(类似getchar函数)
int 21H;调用21号中断
mov ax,4C00H;退出
int 21H
rkmain endp ;程序结束
start:call rkmain ;从当前位置跳转到指定指令
code ends ;代码段结束
end start
flag寄存器
-
CF位:进位位
如果运算结果的最高位产生一个进位或错位,则CF置1,否则CF清零。
-
ZF位:零值位
如果运算结果为零则ZF置1。否则清零。
cmp指令
一个对比指令 CMP OPRD1,OPRD2
功能:对两数进行相减进行比较,和SUB指令的唯一不同是,SUB会把相减后的结果存放在数据1中,CMP则不会。CMP会在相减之后去影响标志位
例:
①相等
AX=8
BX=8
CMP AX,BX
AX-BX=0 ZF=1
②AX>BX
AX=8
BX=1
CMP AX,BX
AX-BX=!=0 ZF=0 CF=0
③AX<BX
AX=1
BX=2
CMP AX,BX
此时不够减会发生借位 AX-BX=? CF=1
用于:1.分支 2.循环
那么如何用于分支和循环?
JCC指令
以 J 开头的 ”Jxx“这一类的指令功能都是用于跳转
JMP指令——无条件跳转
格式:JMP address
JE/JZ指令——等于则跳转 ZF=1
JNE address 不等于则跳转 ZF=0
JB address 低于则跳转 CF=1
JA address 高于则跳转 CF=0 && ZF=0
JNA address 不高于则跳转 CF=1 或者 ZF=1
JNB address 不低于则跳转 CF=0
assume cs:code,ds:data ;取名为code的代码段和取名为data的数据段
data segment ;数据段开始
buffer db 0DH,0AH,'rkvir1$';(16位汇编特有写法)字符串
buffer db 0DH,0AH,'rkvir2$'
;buffer db 'rkvir',0(32/64位写法)
data ends ;数据段结束
code segment ;代码段开始
rkmain proc ;主函数开始
mov ax,data
mov ds,ax
mov dx,offset buffer;将buffer地址传入dx
mov ah,09H
int 21H ;将字符串显示出去
mov ax,1
mov bx,2
cmp ax,bx
ja rk1 ;如果大于 就跳转
mov dx,offset buffer
mov ah,09H
int 21H
rk1: ;跳到此处 (放到跳出指令的上面还是下面都是可以的)
mov ah,07H;键盘输入(类似getchar函数)
int 21H;调用21号中断
mov ax,4C00H;退出
int 21H
rkmain endp ;程序结束
start:call rkmain ;从当前位置跳转到指定指令
code ends ;代码段结束
end start
jmp rk1 ;跳出 (没有停止条件)
如何实现if(ax>bx&&ax==5)的功能?:第一个满足了再判断下一个
如何实现for(int i=0;i<=100;i++)?:
mov cx,0 ;初始化cx
rk2:
cmp cx,100 ;比较cx 与 100
ja rk1 ;若cx>100 跳转
mov dx,offset buffer
mov ah,09H
int 21H
jmp rk2
rk1:
;这样就构成了个循环