gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:21:16 30 4
gpt4 key购买 nike

给定的是 Intel 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

上面的程序使用“基数+索引”寻址方式添加数组的数量。

可以通过以下方式执行相同的操作:
mov ax, array[di]

现在我在这里有以下问题:
  • array[di]有什么区别和 [array+di]
  • array[di]是哪种内存寻址方式?
  • 哪个更好用,为什么?
  • 最佳答案

    据书The Art of Assembly Language , array[di][array + di]都是“索引寻址模式”,因此,没有一个比另一个更好,只是同一事物的不同语法。栏目4.6.2.3 Indexed Addressing Modes书中解释说重要的是常量值和索引(或基址)寄存器的存在 :

    The indexed addressing modes use the following syntax:

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

    The offsets generated by these addressing modes are the sum of the constant and the specified register.

    enter image description here

    You may substitute si or di in the figure above to obtain the [si+disp] and [di+disp] addressing modes.



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

    Variable is a memory location. For a programmer it is much easier to have some value be kept in a variable named "var1" than at the address 5A73:235B.



    值得一提的是,对于相同的寻址模式,不同的汇编器可能会使用不同的语法,例如, MASM vs NASM , 或 NASM vs GAS .

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

    enter image description here
    enter image description here

    关于assembly - 汇编中数组[di] 和[array + di] 寻址的根本区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40659111/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com