【組立言語ノート】セブン:ブランチプログラム構成

過去:

 

[アセンブリ言語のメモ] 0:(私の最初のアセンブラー)

[アセンブリ言語のメモ] 2つ:データ表現

[アセンブリ言語のメモ] 3:データのアドレス指定

[アセンブリ言語のメモ] 4つ:一般的なデータ処理手順

[アセンブリ言語のメモ] 5:順次プログラム構造

【組立言語ノート】6:ループプログラム構造

 

ディレクトリ

 

ブランチプログラムの構造

転送指示

命令アドレッシング

命令相対アドレッシング

命令の直接アドレッシング

命令の間接アドレス指定

支配権の移転

セグメント内転送

セグメント間転送

無条件転送命令(JMP)

JMPプログラム

条件付き転送命令(Jcc)

ゼロフラグZFを使用した条件付き分岐命令

キャリーフラグCFを使用した条件付き分岐命令

オーバーフローフラグOFを使用した条件付き分岐命令

シンボルフラグSFを使用した条件付き分岐命令

パリティフラグPFを使用した条件付き分岐命令

2つの符号なし整数の条件付き分岐命令

2つの符号付き整数を使用した条件付き分岐命令

条件付き命令

比較コマンド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を使用した条件付き分岐命令

2つの符号なし整数の条件付き分岐命令

2つの符号付き整数を使用した条件付き分岐命令

条件付き命令

比較コマンド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