mov al, byte[si + bx] 变成 mov al, [bx+si+1]

mov al, byte[si + bx] becomes mov al, [bx+si+1]

在尝试为 提供完整的工作(已调试)示例时,我无法理解 assembled 代码。我对旧的 DOS + TASM 组合有点生疏。

这是我的汇编代码 (print.asm):

.MODEL SMALL
.STACK 64
.DATA
    string DB 'Something'
    len equ $-string

.CODE

Entry:
    mov ax, @data   ;make DS point to our DATA segment
    mov ds, ax

    xor bx, bx    
    mov si, offset string

Char:
    mov al, byte[si + bx]
    mov ah, 2
    mov dl, al
    int 21h

    inc bx
    cmp bx, len
    jnz Char

Fin:
    mov ax, 4c00h
    int 21h

END Entry

我assemble和

tasm print.asm
tlink print.obj

生成 16 位可执行文件 print.exe

测试的时候,看到程序输出的时候很惊讶

omething

当我查看 assembled 对象时,我可以看到:

_TEXT:0000 start:
_TEXT:0000                 mov     ax, seg DGROUP
_TEXT:0003                 mov     ds, ax
_TEXT:0005                 xor     bx, bx
_TEXT:0007                 mov     si, offset unk_10030
_TEXT:000A
_TEXT:000A loc_1001A:                              ; CODE XREF: _TEXT:0017j
_TEXT:000A                 mov     al, [bx+si+1]   ; <== I do not understand the '+1'
_TEXT:000D                 mov     ah, 2
_TEXT:000F                 mov     dl, al
_TEXT:0011                 int     21h             ; DOS - DISPLAY OUTPUT
_TEXT:0011                                         ; DL = character to send to standard output
_TEXT:0013                 inc     bx
_TEXT:0014                 cmp     bx, 9
_TEXT:0017                 jnz     short loc_1001A
_TEXT:0019                 mov     ax, 4C00h
_TEXT:001C                 int     21h             ; DOS - 2+ - QUIT WITH EXIT CODE (EXIT)
_TEXT:001C                                         ; AL = exit code

我对从我的 mov al, byte[si + bx] 生成的 mov al, [bx+si+1] 感到困惑,它指向字符串开头的 1 个字节。

byte[si + bx] 是 NASM 语法。在 TASM 语法中相当于 [si + bx + byte],它等于 [si + bx + 1].

在 "Expressions" 部分的 TASM 手册中,您有一个名为 "Standard symbol values" 的 table,您可以在其中看到符号 "BYTE" 对应于值 1 .

你要的是byte ptr [si + bx]。或者你可以在这种情况下简单地使用 [si + bx] 因为没有歧义(因为 al 的大小是汇编程序已知的)。