[汇编语言笔记篇]七:分支程序结构

往期:

[汇编语言笔记篇]0:(我的第一个汇编程序)

[汇编语言笔记篇]二:数据的表示

[汇编语言笔记篇]三:数据寻址

[汇编语言笔记篇]四:通用数据处理指令

[汇编语言笔记篇]五:顺序程序结构

[汇编语言笔记篇]六:循环程序结构

目录

 

分支程序结构

转移指令

指令寻址

指令的相对寻址

指令的直接寻址

指令的间接寻址

控制转移

段内转移

段间转移

无条件转移指令(JMP)

JMP程序

条件转移指令(Jcc)

利用零标志ZF的条件转移指令

利用进位标志CF的条件转移指令

利用溢出标志OF的条件转移指令

利用符号标志SF的条件转移指令

利用奇偶标志PF的条件转移指令

两个无符号整数大小关系的条件转移指令

两个有符号整数大小关系的条件转移指令

产生条件的指令

比较指令CMP

测试指令TEST

个数拆半程序

位测试

单分支结构

求绝对值程序

字母判断程序

双分支结构

显示数据最高位程序

有符号数加减运算溢出程序


分支程序结构

转移指令

指令寻址

指令的相对寻址

指令的直接寻址

指令的间接寻址

控制转移

段内转移

段间转移

无条件转移指令(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
发布了48 篇原创文章 · 获赞 23 · 访问量 2748

猜你喜欢

转载自blog.csdn.net/weixin_43252204/article/details/105509985
今日推荐