汇编指令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