nasm : test instruction - test

汇编指令test操作数2的测试


; /// @file boot_dispmsg/testcase_op_code_test.asm
; /// @brief 测试jmp命令的向上跳和向下跳的的目标地址计算
; /// @note 编译命令行 
; /// cd D:\prj\nasm_prj\boot\boot_dispmsg
; /// d:
; /// C:\nasm\nasm.exe testcase_op_code_test.asm -o testcase_op_code_test.bin -l testcase_op_code_test.list
; /// @note 将 testcase_op_code_test.bin 写到U盘0扇区

bits 16 ; ///< 16位汇编
org 0x7c00

	cli ; ///< 关中断
	
	xor ax, ax
	mov ds, ax ; ///< 使si的默认段寄存器为实模式当前段, 和代码段寄存器cs一样, 都是0
	mov es, ax ; ///< 使di的默认段寄存器为实模式当前段, 和代码段寄存器cs一样, 都是0
	mov ss, ax ; ///< 使sp的默认段寄存器为实模式当前段, 和代码段寄存器cs一样, 都是0
	mov sp, 0x7c00
	
	sti ; ///< 开中断
	cld ; ///< 清方向标志, 使基于si,di的操作后, si++, di++

	; /// 通过测试可知, test 的操作数2,是要测试位的2的位权的组合, 而不是位索引
	; /// 操作数2在测试操作数1单独指定位时的值 = 2 ^ 位的索引(0,1,2,3,4,5,6,7...)
test_case_bit0:	
	mov al, 1
	test al, 1
	jz test_case_bit1
	
	mov si, str_jnz_bit_0
	call fn_disp_str

test_case_bit1:
	mov al, 2
	test al, 2
	jz test_case_bit2
	
	mov si, str_jnz_bit_1
	call fn_disp_str

test_case_bit2:
	mov al, 4
	test al, 4
	jz test_case_bit3
	
	mov si, str_jnz_bit_2
	call fn_disp_str
	
test_case_bit3:
	mov al, 8
	test al, 8
	jz test_case_bit4
	
	mov si, str_jnz_bit_3
	call fn_disp_str

test_case_bit4:
	mov al, 16
	test al, 16
	jz test_case_bit5
	
	mov si, str_jnz_bit_4
	call fn_disp_str

test_case_bit5:
	mov al, 32
	test al, 32
	jz test_case_bit6
	
	mov si, str_jnz_bit_5
	call fn_disp_str

test_case_bit6:
	mov al, 64
	test al, 64
	jz test_case_bit7
	
	mov si, str_jnz_bit_6
	call fn_disp_str

test_case_bit7:
	mov al, 128
	test al, 128
	jz test_case_bit_end
	
	mov si, str_jnz_bit_7
	call fn_disp_str

test_case_bit_end:
	mov si, str_prog_end
	call fn_disp_str
	
	jmp $

str_jnz_bit_0:
	db "al bit 0 is 1", 0x0d, 0x0a, 0

str_jnz_bit_1:
	db "al bit 1 is 1", 0x0d, 0x0a, 0

str_jnz_bit_2:
	db "al bit 2 is 1", 0x0d, 0x0a, 0

str_jnz_bit_3:
	db "al bit 3 is 1", 0x0d, 0x0a, 0

str_jnz_bit_4:
	db "al bit 4 is 1", 0x0d, 0x0a, 0

str_jnz_bit_5:
	db "al bit 5 is 1", 0x0d, 0x0a, 0

str_jnz_bit_6:
	db "al bit 6 is 1", 0x0d, 0x0a, 0

str_jnz_bit_7:
	db "al bit 7 is 1", 0x0d, 0x0a, 0

str_prog_end:
	db "END", 0x0d, 0x0a, 0

	; /// 显示字符串
fn_disp_str:
	pusha
	
fn_disp_str_disp_one_char_from_si:	
	; int 0x10, ah = 0x0e
	; - VIDEO - 写字符并移动光标 (TTY WRITE)
	; AL = character, BH = display page (alpha modes)
	; BL = foreground color (graphics modes)

	lodsb ; ///< load byte to al from si, then si++
	and al, al
	jz fn_disp_str_end ; ///< 字符串是以0结尾的
	
	mov ah, 0x0e
	
	; /// 颜色值定义参考 http://blog.csdn.net/lostspeed/article/details/48469103
	mov bx, 7 ; ///< 显示页为0, 前景色为白色
	int 0x10
	
	jmp fn_disp_str_disp_one_char_from_si
	
fn_disp_str_end:
	popa
	ret

;--------------------------------------------------------------------------------
; 填充区
;--------------------------------------------------------------------------------
times 512 - ($ - $$) - 2 db 0

; 如果是在0扇区做实验, 扇区末尾必须是0x55aa, 表明启动签名有效
dw 0xaa55



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值