[英]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]
现在我有以下问题:
array[di]
和[array+di]
之间的区别是什么 array[di]
? 根据汇编语言的艺术 , array[di]
和[array + di]
都是“索引的地址模式”,因此,没有一个比另一个好,只是同一个东西的不同语法。 本书的4.6.2.3索引寻址模式部分解释了重要的是存在一个常量值和一个索引(或基址)寄存器 :
索引寻址模式使用以下语法:
mov al, disp[bx] mov al, disp[bp] mov al, disp[si] mov al, disp[di]
这些寻址模式产生的偏移是常数和指定寄存器的总和 。
您可以在上图中替换si或di来获得[si + disp]和[di + disp]寻址模式。
我们调用“恒定值”的变量array
因为变量是在数据段的偏移量(因此它们是恒定值),如所解释这里 :
变量是一个内存位置。 对于程序员来说,将一些值保存在名为“var1”的变量中比在地址5A73:235B中保存要容易得多。
重要的是要提到不同的汇编器可以针对相同的寻址模式使用不同的语法,例如, MASM与NASM或NASM与GAS 。
还有其他寻址模式可以改变所涉及指令的大小(以字节为单位)和性能(以时钟周期), 这里可以阅读。 接下来是指令MOV
和寻址模式:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.