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
的大小是汇编程序已知的)。
在尝试为
这是我的汇编代码 (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
的大小是汇编程序已知的)。