gpt4 book ai didi

nasm - 了解用于在电传打字机模式下输出字符的 nasm 汇编

转载 作者:行者123 更新时间:2023-12-02 01:42:07 27 4
gpt4 key购买 nike

我正在阅读这篇关于操作系统编程的精彩脚本

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

您可能希望联系评论/代码的作者,并让他们知道他们的评论不准确。他们编写的代码是正确的。

如果汇编器支持它们,我更喜欢使用 0x0b0o 等前缀,而不是后缀 h , b, o 因为某些后缀可能形成寄存器名称或其他标识符和符号。使用后缀时,如果您的值必须以字母开头(即:十六进制的 A 到 F),请在开头添加 0,让汇编器知道您正在表示一个值。例如,AAh 必须写为 0AAhBh 必须写为 0Bh

关于nasm - 了解用于在电传打字机模式下输出字符的 nasm 汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32923556/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com