【问题标题】:mov al, byte[si + bx] becomes mov al, [bx+si+1]mov al, byte[si + bx] 变成 mov al, [bx+si+1]
【发布时间】: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 个字节。

【问题讨论】:

  • 我假设byte1(即一个字节的大小),并且一些汇编程序允许括号外的偏移量(因此它类似于数组索引)。 al 已经暗示了byte,所以不需要写出来,但如果你愿意,它可能应该是byte ptr
  • @Jester:删除byte 修复了“错误”。我一直认为 byte word 和 al 在评估内存时建议汇编器使用正确的操作码,而不是在偏移计算中使用。虽然更常见的是byte ptr
  • 您可能需要考虑使用 TASM 的理想模式。它将 BYTE 解释为 1,以便与 MASM 5 兼容。在理想模式下,它会出错。但是,您需要重写大部分代码,几乎所有指令。

标签: assembly tasm


【解决方案1】:

byte[si + bx] 是 NASM 语法。在 TASM 语法中相当于[si + bx + byte],相当于[si + bx + 1]

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

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

【讨论】:

  • 我有 Tasm 5 手册。感谢您提供该指针并使用更常见的 nasm 语法消除歧义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
相关资源
最近更新 更多