往期:
[汇编语言笔记篇]0:(我的第一个汇编程序)
[汇编语言笔记篇]二:数据的表示
[汇编语言笔记篇]三:数据寻址
[汇编语言笔记篇]四:通用数据处理指令
[汇编语言笔记篇]五:顺序程序结构
[汇编语言笔记篇]六:循环程序结构
目录
分支程序结构
转移指令
指令寻址
指令的相对寻址
指令的直接寻址
指令的间接寻址
控制转移
段内转移
段间转移
无条件转移指令(JMP)
JMP程序
条件转移指令(Jcc)
利用零标志ZF的条件转移指令
利用进位标志CF的条件转移指令
利用溢出标志OF的条件转移指令
利用符号标志SF的条件转移指令
利用奇偶标志PF的条件转移指令
两个无符号整数大小关系的条件转移指令
两个有符号整数大小关系的条件转移指令
产生条件的指令
比较指令CMP
测试指令TEST
个数拆半程序
位测试
单分支结构
求绝对值程序
字母判断程序
双分支结构
显示数据最高位程序
有符号数加减运算溢出程序
; 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
; 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