mov ax,0x0001
and ax,dx
add ah,48
mov byte [HEX_OUT+5],ah
在上面的代码片段中,您只保留了一位,而您需要保留 4 位。
您还做了补充AH
当结果肯定是AL
.
由于 ASCII 集的组织方式,您不能简单地添加 48 来转换为十六进制。 “9”(57)的编码和“A”(65)的编码之间存在差距。您的代码需要考虑到这一点!
对于最低有效的十六进制数字:
mov ax, dx ;Original number
and al, 15 ;Keep 4 bits
add al, '0' ;Make text
cmp al, '9'
jbe .LessA ;Already fine for '0' to '9'
add al, 7 ;Bridge the gap to reach 'A' to 'F'
.LessA:
mov [HEX_OUT + 5], al
对于下一个十六进制数字,这将变成:
mov ax, dx ;Original number
shr ax, 4
and al, 15 ;Keep 4 bits
add al, '0' ;Make text
cmp al, '9'
jbe .LessA ;Already fine for '0' to '9'
add al, 7 ;Bridge the gap to reach 'A' to 'F'
.LessA:
mov [HEX_OUT + 4], al
对于下一个十六进制数字,这将变成:
mov ax, dx ;Original number
shr ax, 8
and al, 15 ;Keep 4 bits
add al, '0' ;Make text
cmp al, '9'
jbe .LessA ;Already fine for '0' to '9'
add al, 7 ;Bridge the gap to reach 'A' to 'F'
.LessA:
mov [HEX_OUT + 3], al
对于下一个十六进制数字,这将变成:
mov ax, dx ;Original number
shr ax, 12
and al, 15 ;Keep 4 bits
add al, '0' ;Make text
cmp al, '9'
jbe .LessA ;Already fine for '0' to '9'
add al, 7 ;Bridge the gap to reach 'A' to 'F'
.LessA:
mov [HEX_OUT + 2], al
这很快就变得比对我们有利的时间更长,所以使用loop会好很多。
下一个解决方案将从高端开始,但最终结果不会有什么不同。
mov bx, 2 ;Position for most significant digit
.Next:
ror dx, 4 ;Bring digit in lowest 4 bits
mov al, dl ;Copy number
and al, 15 ;Keep 4 bits
add al, '0' ;Make text
cmp al, '9'
jbe .LessA ;Already fine for '0' to '9'
add al, 7 ;Bridge the gap to reach 'A' to 'F'
.LessA:
mov [HEX_OUT + bx], al
inc bx
cmp bx, 6 ;Did we fill chars at +2 +3 +4 +5 ?
jb .Next ;Not yet
因为这个循环中有 4 次迭代,并且数字DX
每次旋转 4 倍,DX
最终会保持原来的值。无需保存它。
jmp endi;
这是要达到什么目的?这是跳转到data那肯定不是可执行代码!如果你想要一个无限循环,那么只需写:
jmp $
您所说的与其他模块一起使用的另一个文件是一团糟!
大家一直忽视这一点,但BIOS电传打字机功能需要BH
注册以获得所需的显示页面。因此使用它总是一个坏主意BX
作为字符串指针。
这是一个很好的解决方案,不需要您更改所有现有代码(关于使用BX
):
print_string:
pusha
mov si, bx
mov bh, 0 ;Display page 0
;mov bl, 7 ;Color if this were a graphical screen
cld ;Required to use LODSB correctly
jmp .start
.write:
mov ah, 0x0E ;BIOS.Teletype
int 0x10
.start:
lodsb ;Increments the pointer automatically
cmp al, 0 ;Comparing for null
jne .write
popa
ret