汇编学习笔记(14)--控制转移指令

无条件跳转指令jmp

jmp dest;短跳
;ip=dest
;jmp idata
;jmp short idata
;短跳的目标地址idata与该指令的下条指令的偏移地址之间的距离必须在[-128,127]之内
;短跳指令编译成机器码后,前面一个字节为EBh表示短跳,后一个字节为1个8位符号数表示目标地址与下条指令偏移地址之差

jmp dest;近跳
ip=dest;jmp idata jmp reg jmp mem
;指令编码位3个字节,第一字节位E9h,第二与第三字节构成一个16位符号数表示目标地址与下条指令的偏移地址之差

jmp dest;远眺
cs:ip =dest
;jmp idata idata是一个以seg:offset表示的32位立即数 jmp mem,mem是一个双字,前一个字表示偏移地址,后一个是段地址
;远跳指令的编码位5个字节,第一个字节位EAh,后面四个字节中前两个字节构成跳转的偏移地址,后两个字节构成跳转的段地址

条件跳转指令

jz dest;zf=1
je dest;等价于上,符号数非符号数都可以

jnz dest;zf=0
jne dest;等价于上,符号数非符号数都可以

jc dest;jump if carry,cf=1跳转
jb;非符号数,cf=1
jnae;非符号数

jnc dest; 无进位跳转 ,cf=0
jnb;非符号数
jae;非符号数,大于等于,cf=0

js dest;sf=1符号位则跳
jns dest ;sf=0

jo dest;of=1 有溢出跳
jno dest

jp dest;pf=1奇偶位则条
jpe;jump if parity even

jnp dest;pf=0
jpo

ja dest;jumo if above 非符号数,cf=0且zf=0
jnbe;非符号数

jbe dest;非符号数,cf=1或zf=1
jna dest;非符号数

jg dest;符号数 sf=of且zf=0
jnle;符号数

jge dest;符号数sf=0或zf=1
jnl;符号数

jl dest;符号数sf!=of且zf=0
jnge;符号数

jle dest;符号数 sf!=of或zf=1
jng;符号数
;注意以上这些都属于短跳

jcxz dest;若cx等于0则跳转
;也是短跳

循环指令loop,loopz,loope,loopnz,loopne

loop dest;循环
;操作:
cx--
if(cx!=0)
ip=dest
;格式loop idata
ex:
mov ax,0
mov bx,1
mov cx,100
again:
	add ax,bx
	inc bx
	loop again;等价于dec cx jnz again
;注意loop也属于短跳,偏移地址差必须落在范围[-128,127]

loopz dest;若等于零则循环
;操作
temp=fl
cx--
fl=temp
if(cx!=0&&zf==1)
ip=dest
;格式同上
ex:
mov ax,0
mov bx,8
mov cx,10
again:
	inc ax
	shr bx,1
	test bx,1;对bx和1进行and,影响标志位
	loopz again;cx--若cx!=和zf=1跳转
;也属于短跳

loope dest;等价于loopz

loopnz dest;等价于loopne dest
;操作
temp=fl
cx--
fl=temp
if(cx!=0&&zf==0)
ip=dest
;类似loope 的操作

子程序调用和返回指令call,retn,retf

call dest;近过程调用
;操作
push ip;把下条指令的偏移地址压入堆栈
ip=dest;跳到dest
;格式:
call idata call reg(16位寄存器) call mem(16位字)

retn [count];近返回
;retn指令一般用于从call调用的过程中返回,为了书写方便,也可以写作ret
;ret操作
pop ip
;ret count操作
pop ip
sp=sp+count;

call dest;远过程低矮哦用
;操作
push cs
push ip
cs:ip=dest
;格式
call idata(32位立即数seg:offset,) call mem(双字,钱一个字为偏移地址,后一个为段地址)
call 1234h:5678h 
mov word ptr ds:[10f0h],5678h
mov word ptr ds:[10f2h],1234h
call dword ptr ds:[10f0h]

retf [count];远返回
;retf操作
pop ip
pop cs
;retf count操作
pop ip
pop cs
add sp,count

中断和中断返回指令int into iret

int n;中断
;操作
pushf;把标志寄存器压入堆栈
push cs
push ip;把下条指令的偏移地址压入堆栈
tf=0,if=0
ip=word ptr 0000h:[n*4];从中断向量表中取出ip
cs=word ptr 0000h:[n*4+2]

into ;溢出中断
if(of==1)
int 04h
;格式 into

iret;中断返回
;用于从int或into指令产生的中断股哦城中返回
;操作
pop ip
pop cs
popf
;格式iret
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值