gpt4 book ai didi

assembly - 为什么我从 mov ax, bx+si+1 得到零?

转载 作者:行者123 更新时间:2023-12-01 13:12:56 27 4
gpt4 key购买 nike

    mov     ax,10
mov bx,4
mov si,ax
mov ax,bx+si+1
LEA ax,[bx+si+1]

当我将 bx,si 和 1 加在一起并移动到 ax 时,结果为 0。在下一行,当我使用 LEA 时它起作用并且我得到 15。

为什么我在使用 move 时得到零?

最佳答案

您的问题是:“为什么我从 mov ax, bx+si+1 得到零?”。很难给你一个准确的答案,因为你忘了告诉你使用的是什么编译器,而且你的代码片段不包含数据段,所以我们看不到你的数据。我们可以做的是用数据段中的一些数字测试您的代码并查看结果:

.model small
.stack 100h
.data
xy db 0A0h,0A1h,0A2h,0A3h,0A4h,0A5h,0A6h,0A7h,0A8h,0A9h,0AAh,0ABh,0ACh,0ADh,0AEh,0AFh,0B0h
.code
mov ax, @data
mov ds, ax

mov ax, 10
mov bx, 4
mov si, ax
mov ax, bx+si+1 ;◄■■ #1 (EXPLANATION BELOW ▼)
LEA ax, [bx+si+1] ;◄■■ #2 (EXPLANATION BELOW ▼)

让我们来说明这里发生了什么:

enter image description here

这是正在发生的事情:

#1 由于基址寄存器 (bx) 和变址寄存器 (si) 的存在,总和被解释为内存寻址,因此代码获取内存位置 15 中的数据。ax 寄存器大小为 2 个字节,因此结果是 ax 从内存位置 15 开始获取 2 个字节,在我们的数据段中,这 2 个字节是 0AFh0B0halax 的低字节,所以第一个字节(0AFh)存储在那里,高字节ah获取第二个字节 (0B0h),这就是 ax 变成 0B0AFh 的方式。

#2 我们说过基址寄存器 bx 和索引寄存器 si 的存在被解释为内存寻址,所以 [bx+si+1] 指向内存位置 15 (0AFh)。 lea指令代表load effective address,其目的是从数据段内部获取一个地址。您的代码行正在获取内存位置 15 (0AFh) 的有效地址,即 15。

这么多的理论需要论证,这里是:

接下来是 EMU8086 的截图:BLUE 箭头指向原始代码行,GREEN 箭头指向被解释的代码行(作为内存寻址),RED 箭头显示寄存器 ax (B0AFh) 中的效果。

enter image description here

现在是下一条指令的屏幕截图:BLUE 箭头指向原始代码行,GREEN 箭头指向被解释的代码行(注意它与前一个相同),RED 箭头显示寄存器 ax (0Fh) 中的效果。

enter image description here

最后,让我们在Visual Studio 2013中测试代码:下一个截图证明mov ax, bx+si+1是无效的,而另一行给出了与EMU8086相同的结果(斧头=0FH) :

enter image description here

那么,“为什么你从 mov ax, bx+si+1 得到零?”因为您的数据段内的内存位置 15 中可能有一个零。您可能认为 bx+si+1 会给您一个正常的数字 15,但现在您知道使用基址寄存器和变址寄存器将被解释为内存寻址,所以您不必'得到数字 15 但内存位置 15 中的数据

关于assembly - 为什么我从 mov ax, bx+si+1 得到零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40719027/

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