往期:
目录
分支程序结构
转移指令
指令寻址
指令的相对寻址
指令的直接寻址
指令的间接寻址
控制转移
段内转移
段间转移
无条件转移指令(JMP)
JMP程序
; eg0404.asm in Windows Console
include io32.inc
.data
nvar dword ?
.code
start:
jmp labl1 ;相对寻址
nop
labl1: jmp near ptr labl2 ;相对近转移
nop
labl2: mov eax,offset labl3
jmp eax ;寄存器间接寻址
nop
labl3: mov eax,offset labl4
mov nvar,eax
jmp nvar ;存储器间接寻址
nop
labl4:
exit 0
end start
条件转移指令(Jcc)
利用零标志ZF的条件转移指令
利用进位标志CF的条件转移指令
利用溢出标志OF的条件转移指令
利用符号标志SF的条件转移指令
利用奇偶标志PF的条件转移指令
两个无符号整数大小关系的条件转移指令
两个有符号整数大小关系的条件转移指令
产生条件的指令
比较指令CMP
测试指令TEST
个数拆半程序
; eg0405.asm in Windows Console
include io32.inc
.data
.code
start:
mov eax,885 ;假设一个数据
shr eax,1 ;数据右移进行折半
jnc goeven ;余数为0,即CF=0条件成立,不需要处理,转移
add eax,1 ;否则余数为1,即CF=1,进行加1操作
goeven: call dispuid ;显示结果
exit 0
end start
流程框图
位测试
使用JZ指令实现
; eg0406.asm in Windows Console
include io32.inc
.data
no_msg byte 'Not Ready!',0
yes_msg byte 'Ready to Go!',0
.code
start:
mov eax,56h ;假设一个数据
test eax,02h ;测试D1位(使用D1=1,其他位为0的数据)
jz nom ;D1=0条件成立,转移
mov eax,offset yes_msg ;D1=1,显示准备好
jmp done ;跳转过另一个分支体!
nom: mov eax,offset no_msg ;显示没有准备好
done: call dispmsg
exit 0
end start
使用JNZ指令实现
; eg0406a.asm in Windows Console
include io32.inc
.data
no_msg byte 'Not Ready!',0
yes_msg byte 'Ready to Go!',0
.code
start:
mov eax,58h ;假设一个数据
test eax,02h ;测试D1位(使用D1=1,其他位为0的数据)
jnz yesm ;D1=1条件成立,转移
mov eax,offset no_msg ;D1=0,显示没有准备好
jmp done ;跳转过另一个分支体!
yesm: mov eax,offset yes_msg ;显示准备好
done: call dispmsg
exit 0
end start
单分支结构
求绝对值程序
; eg0409.asm in Windows Console
include io32.inc
.data
.code
start:
call readsid ;输入一个有符号数,从EAX返回值
cmp eax,0 ;比较EAX与0
jge nonneg ;条件满足:EAX≥0,转移
neg eax ;条件不满足:EAX<0,为负数,需求补得正值
nonneg: call dispuid ;分支结束,显示结果
exit 0
end start
字母判断程序
; eg0410.asm in Windows Console
include io32.inc
.data
.code
start:
call readc ;输入一个字符,从AL返回值
cmp al,'A' ;与大写字母A比较
jb done ;比大写字母A小,不是大写字母,转移
cmp al,'Z' ;与大写字母Z比较
ja done ;比大写字母Z大,不是大写字母,转移
or al,20h ;转换为小写
call dispcrlf ;回车换行(用于分隔)
call dispc ;显示小写字母
done:
exit 0
end start
双分支结构
显示数据最高位程序
; eg0411.asm in Windows Console
include io32.inc
.data
dvar dword 0bd630422h ;假设一个数据
.code
start:
mov ebx,dvar
shl ebx,1 ;EBX最高位移入CF标志
jc one ;CF=1,即最高位为1,转移
mov al,'0' ;CF=0,即最高位为0:AL='0'
jmp two ;一定要跳过另一个分支体
one: mov al,'1' ;AL='1'
two: call dispc ;显示
exit 0
end start
有符号数加减运算溢出程序
; eg0412.asm in Windows Console
include io32.inc
.data
dvar1 dword 1234567890 ;假设两个数据
dvar2 dword -999999999
dvar3 dword ?
okmsg byte 'Correct!',0 ;正确信息
errmsg byte 'ERROR ! Overflow!',0 ;错误信息
.code
start:
mov eax,dvar1
sub eax,dvar2 ;求差
jo error ;有溢出,转移
mov dvar3,eax ;无溢出,保存差值
mov eax,offset okmsg ;显示正确
jmp disp
error: mov eax,offset errmsg ;显示错误
disp: call dispmsg
exit 0
end start