在试图为提供一个完整的工作(调试)例如这个问题,我无法理解的汇编代码.我有点生锈与旧的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个字节.
byte[si + bx]是NASM语法.在TASM语法中[si + bx + byte],它等于,等于[si + bx + 1].
在"表达式"部分的TASM手册中,您有一个名为"标准符号值"的表,您可以在其中看到符号"BYTE"对应于值1.
你想要的是什么byte ptr [si + bx].或者你可以简单地使用[si + bx]这种情况,因为没有歧义(因为al汇编程序已知大小).
| 归档时间: |
|
| 查看次数: |
494 次 |
| 最近记录: |