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

标签 assembly x86 nasm interrupt bios

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

开始:
mov ah, 0Eh ;用于bios中断
mov si, text_string ;将源索引设置为 text_string 的开头

。重复:
;我试图模仿 lodsb 的行为来了解它是如何工作的:
mov al, [si] ; 将 si 处的字符放入 al 寄存器
add si, 1 ;增加源索引

cmp al, 0 ;如果字符为零(字符串的结尾)
je done ;结束执行

int 10h ;bios 中断将字符放在屏幕上
jmp .repeat

text_string db 'Hello, World!', 0

完毕:
回复

最佳答案

这样做通常不是一个好主意:

  • 假设所有寄存器都在中断调用(或任何调用,真的)中保留;或
  • 没有为给定的调用设置所有必需的寄存器。

  • 在第一个音符上,我会设置 ah0eh紧接在 int 10 之前.
    Int 10h/0eh需要 bhbl分别设置为页码和前景色。我也会在 int 10 之前立即这样做以确保它们为调用设置正确。

    顺便说一句,您需要确保 ds段寄存器是正确的,类似于:
    push cs
    pop ds
    

    因为看起来您正在将字符串放入代码段中。但是,由于lodsb版本显然有效,我假设您已经了解了。

    而且,从(公认的褪色)内存来看,8086 有一个 inc si可能会节省少量空间的指令,并不是那么重要,但我是在每个字节都计算在内的时候伪造的:-)

    关于assembly - 通过bios中断获取要打印的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17309992/

    相关文章:

    c - x86 程序集 : What's the main prologue and epilogue?

    segmentation-fault - 如何在不链接libc.so的情况下访问段寄存器?

    c - Linux 汇编和 printf

    assembly - 汇编语言中 "short"跳转是什么意思?

    assembly - 在运行时检测 64 位模式的 x86-32/x86-64 多语言机器代码片段?

    c - 此汇编函数调用是否安全/完整?

    c++ - 手动创建PE

    c++ - 如何在 Sandy Bridge 上的一系列整数中快速将位计数到单独的 bin 中?

    assembly - 在 x86 汇编语言中返回一个值

    assembly - Near call/jump 表并不总是在引导加载程序中工作