繁体   English   中英

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

[英]Whats the fundamental difference between addressing of array[di] and [array + di] in assembly?

给出的是英特尔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. 哪一个更好用,为什么?

根据汇编语言的艺术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和寻址模式:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM