我正在阅读有关操作系统编程的精彩文章
http://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf
在第12页上有一个简单的引导程序。
如果我了解正确性,那么显示的代码是您必须在NASM中编写的代码,才能使BIOS打印出字符。
我不明白的是:
它说
we need interrupt 0x10 and to set ah to 0x0e (to indicate tele-type mode)
and al to the ASCII code of the character we wish to print.
但是第一个指令是:
mov ah , 0x0e ;int 10/ ah = 0eh -> scrolling teletype BIOS routine
我不明白那条评论。为什么第一行代码没有说:
mov ah, 0xeh
int 0x10
如果那是您需要做什么?
感谢帮助!
最佳答案
尽管Chrono给了您答案,但我不确定它是否能回答您的问题。您似乎在问,为什么注释说明一件事,而代码似乎又说明了另一件事。
基本前缀和后缀
几十年前,许多参考资料和一些反汇编程序使用的默认符号表示的十进制,十六进制,八进制和二进制基数与今天看到的略有不同。他们将基数指定为值的最后一个字符(后缀)。常见的后缀是:
b = binary 10101010b (decimal 170) base 2
d = decimal 170d (decimal 170) \ both d and t mean base 10
t = decimal 170t (decimal 170) /
h = hex 0AAh (decimal 170) base 16
o = octal 252o (decimal 170) base 8
如果数字不包含字母字符,则假定该数字为10进制的十进制数。因此,这也适用:
no alphabetic character 170 decimal 170
大多数汇编程序将接受其中的大多数后缀,但它们也将支持定义为前缀的基数。如果值不是以字母字符结尾,而是以0后跟字母开头,则字母表示基数。常见的前缀基础是:
b = binary 0b10101010 (decimal 170) base 2
d = decimal 0d170 (decimal 170) \ both d and t mean base 10
t = decimal 0t170 (decimal 170) /
h = hex 0xAA (decimal 170) base 16
o = octal 0o252 (decimal 170) base 8
大多数现代汇编程序将支持指定为前缀或后缀的形式。某些汇编程序可能不支持某些前缀和后缀,例如
t
。如果您指定带有前缀基数的数字,则在整个文件中都使用前缀。如果您指定带后缀为基数的数字,则在整个文件中都保留后缀。您可以将它们混合在一起,但是最好在文件中保持一致。
解释int 10 / ah = 0eh
这是什么意思:
int 10/ ah = 0eh -> scrolling teletype BIOS routine
int 10
不包含字母,因此为十进制10
(或十六进制a
)。0eh
以字母结尾,而不以0和字母开头,因此h是后缀。 h
表示十六进制。因此,0eh
是十六进制0e
(或十进制14
)。如果将其放入BIOS的汇编程序代码中,它将看起来像(使用十六进制后缀):
mov ah, 0eh ; Decimal 14
int 0ah ; Decimal 10. The 0 in front makes sure the assembler knows we don't mean register ah!
使用前缀(在此示例中为十六进制):
mov ah, 0xe ; Decimal 14
int 0xa ; Decimal 10
或者,如果您要使用十进制(无前缀或后缀):
mov ah, 14 ; Decimal 14
int 10 ; Decimal 10
但是您现在可能会说嘿,等等!这是错误的,因为BIOS视频中断是
0x10
(或16
十进制),您是正确的!我们刚刚了解到该评论是错误的,或者充其量是非常含糊的。评论应该说:int 10h / ah = 0eh -> scrolling teletype BIOS routine
您可能希望与注释/代码的作者联系,并让他们知道其注释不正确。他们编写的代码是正确的。
如果汇编程序支持它们,则我更喜欢使用前缀
0x
,0b
,0o
之类的前缀而不是后缀h
,b
,o
,因为某些后缀可以形成寄存器名称或其他标识符和符号。使用后缀时,如果您的值必须以字母开头(即:十六进制的A到F),请在开头添加一个0,以使汇编程序知道您代表的是值。例如,AAh
必须写为0AAh
,而Bh
必须写为0Bh
。