克服仅限 BX 的索引限制

问题描述 投票:0回答:2

我正在使用 BIOS 中断实现一个简单的以 0 结尾的字符串打印功能

int 10h

程序如下:

  • 从堆栈弹出到
    dx
    ,这是我们的字符串开始的位置
  • cx
  • 设置计数器
  • 检索
    [dx + cx]
    处的字节。如果为 0,则返回,否则
    mov
    al
  • int 10h
  • 增加
    cx
    并跳回第 3 点

问题是 nasm 只允许我使用

bx
作为索引寄存器。我相信这个限制的目的不是让某人的生活变得更加困难,所以这意味着我的实施有问题。这是什么,我怎样才能克服它?

assembly x86 nasm
2个回答
1
投票

在16位模式下你必须使用BX。例如。 看这里

对于 16 位寻址,偏移值可以位于三个寄存器之一:BX、SI 或 DI


0
投票

编写16位x86汇编时,只有以下寻址模式可用:

    [bx]
    [si]
    [di]
    [bp]
    [bx + si]
    [bx + di]
    [bp + si]
    [bp + di]

加上一个可选常量(以

bp
开头的常量使用
ss
作为默认段寄存器而不是
ds
,但在汇编中开始时我们暂时不会引入段寄存器)。

所以你的代码需要看起来像这样:

.loop:
    push bx
    mov  bx, dx
    add  bx, cx
    mov  ah, ...
    mov  al, [bx]
    pop  bx
    cmp  al, 0
    je  .break
    int  10h
    inc  cx
    jmp  .loop
.break:

但是我们可以通过使用 si 代替并完全省略计数器来做得更好:

    push si        ; SI is normally call preserved
    mov  si, dx
.loop:
    mov  al, [si]
    cmp  al, 0
    je  .break
    int  10h
    inc  si
    jmp  .loop
.break:
    pop  si
© www.soinside.com 2019 - 2024. All rights reserved.