在尝试为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个字节。
答案 0 :(得分:7)
byte[si + bx]
是NASM语法。在TASM语法中,它等同于[si + bx + byte]
,等于[si + bx + 1]
。
在“表达式”部分的TASM手册中,您有一个名为“标准符号值”的表格,您可以在其中看到符号“BYTE”对应于值1.
你想要的是byte ptr [si + bx]
。或者你可以在这种情况下简单地使用[si + bx]
,因为没有歧义(因为汇编程序知道al
的大小)。