Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 从寄存器和地址中移动值_Assembly_Emu8086 - Fatal编程技术网

Assembly 从寄存器和地址中移动值

Assembly 从寄存器和地址中移动值,assembly,emu8086,Assembly,Emu8086,我试图解决emu8086中的无限循环,但无法理解操作背后的逻辑 start: mov di, ds:1234h mov bx, [di] mov ax, [bx] cmp ax, 3 jnz short start 有人能帮我理解所有内存移动之间的逻辑吗?让我们假设以下是寄存器和内存的内容: DS存储0700 DS:1234h存储5 5存储2 2存储3 现在是声明 mov di, ds:1234h 将

我试图解决emu8086中的无限循环,但无法理解操作背后的逻辑

 start:
     mov     di, ds:1234h
     mov     bx, [di]
     mov     ax, [bx]
     cmp     ax, 3
     jnz     short start

有人能帮我理解所有内存移动之间的逻辑吗?

让我们假设以下是寄存器和内存的内容:

DS
存储
0700

DS:1234h
存储
5

5
存储
2

2
存储
3

现在是声明

mov di, ds:1234h
5
传输到
di
。因为内存地址
ds:1234h
0700:1234h
)存储
5

声明呢

mov  bx, [di]
mov  ax, [bx]
cmp  ax, 3
jnz  short start
2
传输到
bx
,因为
di
指向的内存位置(
5
)上的数据存储
2

声明呢

mov  bx, [di]
mov  ax, [bx]
cmp  ax, 3
jnz  short start
3
传输到
ax
,因为
di
指向的内存位置(
2
)上的数据存储
3

声明呢

mov  bx, [di]
mov  ax, [bx]
cmp  ax, 3
jnz  short start
将设置零标志(因为在本例中,
ax
的内容与
3
匹配)

最后是声明

mov  bx, [di]
mov  ax, [bx]
cmp  ax, 3
jnz  short start

如果未将零标志设置为标签
start
,则将跳转(在本例中,不会跳转,因为在前面的语句中设置了零标志)
short
用于8位跳转(还有16位跳转称为近跳转,32位跳转称为远跳转)

逻辑的哪一部分很难理解?
mov di,ds:1234h
不是有效的英特尔语法。我猜它将被编译为
movdi[ds:1234h]
,但需要先检查反汇编才能知道它。。。在这种情况下,它将从
[ds:1234h]
读取
di
值,然后从
[ds:di]
读取
bx
值,最后从
[ds:bx]
读取
ax
值,即三个
短*
指针取消引用
如果(3!=(*(*(*(*ds:1234h)))转到开始
(如果您知道C)