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

Sek*_*eki 1 assembly tasm

在试图为提供一个完整的工作(调试)例如这个问题,我无法理解的汇编代码.我有点生锈与旧的DOS + TASM组合.

这是我的asm代码(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
Run Code Online (Sandbox Code Playgroud)

我聚在一起

tasm print.asm
tlink print.obj
Run Code Online (Sandbox Code Playgroud)

导致16位可执行文件print.exe.

在测试时,我很惊讶地看到程序输出

omething
Run Code Online (Sandbox Code Playgroud)

当我看到组装的物体时,我可以看到:

_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
Run Code Online (Sandbox Code Playgroud)

而且我很困惑mov al, [bx+si+1]从我的mov al, byte[si + bx]那个点生成的字符串开始的1个字节.

Mic*_*ael 7

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

在"表达式"部分的TASM手册中,您有一个名为"标准符号值"的表,您可以在其中看到符号"BYTE"对应于值1.

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