from 于渊 《30天自制操作系统》
DispAL: ;2进制到16进制转换的过程
push ecx
push edx
mov edi, [dwDispPos]
mov ah, 0Fh ;eax的低8位al中存放的原来数据的高8位(31-24),所以可以给ah赋值
mov dl, al ;al 赋给dl,先把al的值保存起来
shr al, 4 ;al右移4位,原来al中的高四位成为低四位
mov ecx, 2
.begin:
and al, 01111b ;保留al的低四位,实际上是原来al的高4位,高4位变为0,这时处理的是原来al的高4位
cmp al, 9 ;前者大于后者跳转 ,即al大于9跳转,al小于9不跳转。
ja .1
add al, '0' ;al小于9还时用数字表示
jmp .2 ;显示
.1:
sub al, 0Ah ;al大于9就要转换为16进制,用字母的方式表示
add al, 'A'
.2:
mov [gs:edi], ax
add edi, 2
mov al, dl ;这时al中低四位就是存放的原来al中的低四位。巧妙的设计。
loop .begin ;跳转到begin继续执行,这时就是跳转上去处理原来al中的低四位
add edi, 2
pop edx
pop ecx
ret