在汇编中寻址数组[di]和[array + di]之间的根本区别是什么?

时间:2016-11-17 15:42:16

标签: assembly masm x86-16 emu8086

给出的是英特尔8086处理器的汇编程序,它在数组中添加数字:

.model small
.stack 100h

.data
    array dw 1,2,3,1,2
    sum   dw ?,", is the sum!$"

.code
main proc
    mov ax,@data
    mov ds,ax

    mov di,0

    repeat:
    mov ax,[array+di]
    add sum,ax
    add di,2           ; Increment di with 2 since array is of 2 bytes

    cmp di,9
    jbe repeat         ; jump if di<=9

    add sum,30h        ; Convert to ASCII
    mov ah,09h
    mov dx,offset sum  ; Printing sum
    int 21h

    mov ax,4c00h
    int 21h
main endp
end  main

以上程序使用“base + index”寻址模式添加数组的数量。

同样的操作可以通过以下方式执行:

mov ax, array[di]

现在我有以下问题:

  1. array[di][array+di]
  2. 之间的区别
  3. 哪种内存寻址模式为array[di]
  4. 哪一个更好用,为什么?

1 个答案:

答案 0 :(得分:6)

根据书籍The Art of Assembly Languagearray[di][array + di]都是“索引的地址模式”,因此,没有一个比另一个好,只是同一个东西的不同语法。本书的4.6.2.3 Indexed Addressing Modes部分解释了重要的是存在一个常量值和一个索引(或基数)寄存器

  

索引寻址模式使用以下语法:

            mov     al, disp[bx]
            mov     al, disp[bp]
            mov     al, disp[si]
            mov     al, disp[di]
     

这些寻址模式产生的偏移量是常量和指定寄存器的

     

enter image description here

     

您可以替换上图中的 si di 来获取[si + disp]和[di + disp]寻址模式。

我们对变量array称之为“常数值”,因为变量是数据段中的偏移量(因此它们是常量值),如here所述:

  

变量是一个内存位置。对于程序员来说,它要容易得多   将某个值保存在名为“var1”的变量中,而不是保存在地址中   5A73:235B

值得一提的是,不同的汇编程序可能会对相同的寻址模式使用不同的语法,例如MASM vs NASMNASM vs GAS

还有其他寻址模式可以改变所涉及指令的大小(以字节为单位)和性能(以时钟周期),可以读取here。接下来是指令MOV和寻址模式:

enter image description here enter image description here