【发布时间】:2016-04-20 15:24:30
【问题描述】:
在尝试为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, byte[si + bx] 生成的mov al, [bx+si+1] 感到困惑,它指向字符串开头的 1 个字节。
【问题讨论】:
-
我假设
byte是1(即一个字节的大小),并且一些汇编程序允许括号外的偏移量(因此它类似于数组索引)。al已经暗示了byte,所以不需要写出来,但如果你愿意,它可能应该是byte ptr。 -
@Jester:删除
byte修复了“错误”。我一直认为byteword和 al 在评估内存时建议汇编器使用正确的操作码,而不是在偏移计算中使用。虽然更常见的是byte ptr。 -
您可能需要考虑使用 TASM 的理想模式。它将 BYTE 解释为 1,以便与 MASM 5 兼容。在理想模式下,它会出错。但是,您需要重写大部分代码,几乎所有指令。