5

给定的是英特尔 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. 哪种内存寻址模式是array[di]
  3. 哪个更好用,为什么?
4

1 回答 1

6

根据《汇编语言的艺术》一书,array[di]两者[array + di]都是“索引寻址模式”,因此,没有一个比另一个更好,只是同一事物的语法不同。本书的第4.6.2.3 节索引寻址模式解释说,重要的是存在常量值和索引(或基址)寄存器

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

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

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

在此处输入图像描述

您可以将上图中的sidi替换为 [si+disp] 和 [di+disp] 寻址模式。

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

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

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

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

在此处输入图像描述 在此处输入图像描述

于 2016-11-17T17:59:12.540 回答