【问题标题】:x86 assembly: Understanding db syntaxx86 程序集:了解 db 语法
【发布时间】:2015-02-25 04:37:44
【问题描述】:

我刚刚开始学习 x86 汇编,并参考了我找到的一本在线书籍:http://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf

在阅读本书并遵循示例时,我遇到了一个我无法解决的问题,因为我对汇编或一般编程的无知。我试图在我的引导扇区程序中构建一些代码,这些代码可以打印一个以空字符结尾的字符串,但程序只打印第一个字符。

这是我尝试运行的一些示例代码:

[org 0x7c00]
    mov bx, Hello
    mov ah, 0x0e
Keep_Printing:
    mov al, [bx]
    cmp al, 0
    je Finished_Printing
    int 0x10
    add bx, 0x0008
    jmp Keep_Printing
Finished_Printing:

    cli
    hlt

Hello:
    db "Hello", 0

times 510-($-$$) db 0       
dw 0xAA55

我在想会发生什么,bx 将包含 Hello 的前两个字母的内存地址,但我不确定当我试图将 16 位寄存器的内容移动到 8 位时会发生什么人的。当我运行它时,它只打印“H”,所以我猜前 8 位进入 al,其余的被忽略?

之后,我希望程序在循环字符串时继续检查 al 是否为 0,如果不是 0,则打印到屏幕上。我不太确定如何迭代在汇编中逐个字符地字符串,但我想既然我有 Hello 的起始地址,我可以继续在 bx 中的内存地址添加 8 位。打印的内容会根据我在“H”之后在内存中击中的内容而改变,但我不确定为什么它不会是字符串的其余部分。

我确定我在各个层面上都误解了各种各样的事情,但希望这里有人可以帮助解决问题。谢谢!

【问题讨论】:

    标签: assembly x86 nasm bootloader 16-bit


    【解决方案1】:

    内存地址是bytes,而不是bits,所以你需要添加1个字节,而不是8位。正如您所拥有的那样,将 8 添加到 BX 将寻址 H 上方的内存 8 bytes,这将是一个 0 字节(因为您指定了 times 510-($-$$) db 0(iow,用 @ 填充到字节 510) 987654328@字节。

    解决方案:将 1 添加到 BX,而不是 8(使用 INC BX 可能会更好地完成 - 更快更短)。

    btw: mov al,[bx] 表示'将BX指向的BYTE(即寄存器BX中包含的地址)移动到AL`

    db 表示define BYTE,而不是bit

    【讨论】:

    • 谢谢!我知道我很愚蠢;)这很有效,我从中学到了一条新指令。
    【解决方案2】:

    正如用户 @Magoo 所说,db 表示“定义字节”,因此要遍历字符串,您需要将指针增加 1 而不是 8。

    切勿使用 BX 作为通过 BIOS 电传功能输出的文本地址。 BH应该是显示页面参数!!!
    在您的代码中它工作,因为文本“Hello”在内存中的内存足够低,BH=0。但这是巧合。

    [org 0x7c00]
        mov si, Hello
        mov ah, 0x0e
    Keep_Printing:
        mov al, [si]
        cmp al, 0
        je Finished_Printing
        int 0x10
        add si, 1
        jmp Keep_Printing
    Finished_Printing:
    
        cli
        hlt
    
    Hello:
        db "Hello", 0
    
    times 510-($-$$) db 0       
    dw 0xAA55
    

    【讨论】:

    • 感谢您的提示,我以前从未听说过 si 寄存器。除了按照上面链接的书进行的操作外,我从未做过任何组装。我查了一下 si ,发现它代表源索引,但还没有真正理解它的用途。用 dx 代替好吗?
    • 不,DX 不能用作指向内存的指针。唯一的选择是 BX、SI、DI 和 BP。请注意,BP 与 SS 段寄存器一起工作,因此会使程序复杂化。
    猜你喜欢
    • 1970-01-01
    • 2014-10-03
    • 2013-06-30
    • 2020-12-06
    • 2015-05-03
    • 1970-01-01
    • 2020-07-02
    • 2016-03-30
    相关资源
    最近更新 更多