给出的是英特尔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]
?答案 0 :(得分:6)
根据书籍The Art of Assembly Language,array[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]
这些寻址模式产生的偏移量是常量和指定寄存器的和。
您可以替换上图中的 si 或 di 来获取[si + disp]和[di + disp]寻址模式。
我们对变量array
称之为“常数值”,因为变量是数据段中的偏移量(因此它们是常量值),如here所述:
变量是一个内存位置。对于程序员来说,它要容易得多 将某个值保存在名为“var1”的变量中,而不是保存在地址中 5A73:235B
值得一提的是,不同的汇编程序可能会对相同的寻址模式使用不同的语法,例如MASM vs NASM或NASM vs GAS。
还有其他寻址模式可以改变所涉及指令的大小(以字节为单位)和性能(以时钟周期),可以读取here。接下来是指令MOV
和寻址模式: