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

时间:2016-04-20 15:24:31

标签: assembly tasm

在尝试为this question提供完整的工作(调试)示例时,我无法理解汇编代码。我对旧的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

我用

组装
tasm print.asm
tlink print.obj

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

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

omething

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

_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, [bx+si+1]中生成的mov al, byte[si + bx]指向字符串开头的1个字节。

1 个答案:

答案 0 :(得分:7)

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

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

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