当前位置: 首页 > 知识库问答 >
问题:

通过bios中断获取要打印的字符串

公良渝
2023-03-14

我正在学习汇编,当然我正在尝试经典的0x10 bios中断。我看过的资源显示使用lodsb打印字符串,因此为了理解操作码,我试图模仿它的行为。这适用于lodsb,但不适用于我拥有的。我做错了什么?:

start:
    mov ah, 0Eh ;for bios interrupt
    mov si, text_string ;set source index to begining of text_string

.repeat:
    ;I'm trying to emulate the behavior of lodsb to learn how it works:
    mov al, [si] ;put character at si in al register
    add si, 1 ;increment source index

    cmp al, 0 ;if the character is a zero (end of the string)
    je done ;end execution

    int 10h ;bios interrupt to put character on screen
    jmp .repeat

    text_string db 'Hello, World!', 0

done:
    ret

共有2个答案

司徒高丽
2023-03-14

第一个lodsb是一个命令,它告诉计算机获取代码中的字符并增加偏移量。偏移量由[SI]确定,这是一个易于设置的寄存器。设置SI后,lodsb获取字符并将其放入al。从这一点开始,读取al并确定要执行的操作。这里还有一个这样的问题。

吴修洁
2023-03-14

通常情况下,最好不要:

  1. 假设所有寄存器都在中断调用(或任何调用,实际上)中保留;或
  2. 未为给定呼叫设置所有必需的寄存器

关于第一个注意事项,我将在int 10之前将ah设置为0eh

Int 10h/0eh要求将bhbl分别设置为页码和前景色。我也会在int 10之前立即这样做,以确保它们为调用设置正确。

另一方面,您需要确保ds段寄存器正确,如下所示:

push cs
pop ds

因为看起来您正在将字符串放入代码段中。然而,由于lodsb版本显然是有效的,我想您已经涵盖了这一点。

而且,从(公认已褪色的)内存中,8086有一条inc-si指令,可以节省少量空间,这并不重要,但我是在每个字节都计数的时候伪造的:-)

 类似资料:
  • 这是用C++语言编写的代码。 为什么在第一个cout语句中,程序尝试打印直到它找到一个空字符,而在第二个语句中,它只打印一个字符?

  • 我知道如何计算出字符串中某个字符或数字的索引,但是有没有任何预定义的方法可以用来给我第n个位置的字符?所以在字符串“foo”中,如果我要求索引为0的字符,它会返回“f”。 注意——在上面的问题中,我所说的“字符”不是指字符数据类型,而是字符串中的字母或数字。这里重要的一点是,调用该方法时,我不会收到char,而是一个字符串(长度为1)。我知道substring()方法,但我想知道是否有更简洁的方法

  • 问题内容: 我知道如何计算字符串中某个字符或数字的索引,但是我可以使用任何预定义的方法在第n个位置给我该字符吗?因此,在字符串“ foo”中,如果我要求索引为0的字符,它将返回“ f”。 注意-在上述问题中,“字符”不是字符数据类型,而是字符串中的字母或数字。这里重要的是,调用该方法时,我不会收到字符,而是一个字符串(长度为1)。而且我知道substring()方法,但是我想知道是否有更整洁的方法

  • 问题内容: 有谁知道如何在Java中检测可打印字符? 一段时间(试用/错误)后,我得到了这种方法: 我通过KeyListener获取输入,然后按Ctr-“键”打印一个正方形。有了这个功能似乎还足够。 我在这里缺少一些字符吗? 问题答案: 看来这是“字体”的独立方式。

  • 问题内容: 如何在基于字符串的PHP中获取属性?我给它打电话。那是什么? 就像… 问题答案: 像这样 或者,如果您可以控制该类,请实现ArrayAccess接口,然后执行此操作

  • 我有一个typescript中的枚举,它有20个字段。我有一个UI应用程序,用户可以将信息放在一些自由文本中(例如,让我们说用户喜欢的颜色)。我的要求是获取这些颜色信息并致电中层服务。midtier服务将Color定义为Enum,与UI枚举定义保持同步。我需要将用户输入文本转换为枚举(在前端),因为在构建过程中会引发编译问题。我没有找到执行转换的方法(例如,从用户输入字符串到特定枚举元素)。任何指