本示例遇到的新汇编指令cmp,je
cmp正确写法
cmp eax,666 ;用eax里的值减去666,如果值为0,则将ZR(ZF)标志位=1
;如果发生借位或进位,CF(CY)标志位=1
;如果溢出,则OF(OV)标志位=1
cmp eax,ebx
cmp byte [123], 123
cmp错误写法
cmp 123,123 ;操作数不可以都是立即数
cmp [0x7c00],[0x7c01] ;操作数不可以都是内存地址
cmp [0x7c00], 666 ;操作数不知道有多长
je正确写法
;标号跳转
there:
cmp byte [si], 0x01 ;不要忘记了si默认使用ds段寄存器
je there ;如果ZF=1,则跳转到there标号处执行
;寄存器跳转
je eax ;直接跳转到物理地址,与段寄存器无关
本文演示定义一个字符串,然后循环取出字符串的每个字符,依次放到显存(0xb8000开始)中
mov ax,0xb800 ;设置ds/si组合,表示显存的段和偏移
mov ds,ax
mov si,0x0
mov ax,0x7c0 ;设置es/bx组合,用来表示字符串
mov es,ax
mov bx,string ;bx是字符串起始地址
print:
mov dl,[es:bx] ;将bx地址中的字符串放到dl中
cmp dl,0 ;判断字符串内容是否是0
je do_not_stop ;如果0就结束,直接跳走了,否则就将内容显示到屏幕上
mov byte [si],dl
inc si
mov byte [si],0bH
inc si
inc bx
jmp print
string db 'Hello World!!I Love Rabbit'
stringend db 0x00
do_not_stop:jmp do_not_stop ;执行无限循环
times 510-($-$$) db 0h
dw 0AA55H