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_X86_X86 16_Emu8086 - Fatal编程技术网

Assembly 在汇编中使用地址

Assembly 在汇编中使用地址,assembly,x86,x86-16,emu8086,Assembly,X86,X86 16,Emu8086,所以我不明白为什么我的程序不能工作,不同的输入有不同的输出。我有两个变量: static_num1_ptr dw 7 ; static_num1_ptr_ptr dw [static_num1_ptr]; 我有以下代码: mov bx,static_num1_ptr_ptr; mov bx,[bx]; mov ax,[bx]; call print_num 为了打印7,我需要更改num1 ptr和num1_

所以我不明白为什么我的程序不能工作,不同的输入有不同的输出。我有两个变量:

   static_num1_ptr    dw 7 ;
   static_num1_ptr_ptr dw [static_num1_ptr]; 
我有以下代码:

    mov     bx,static_num1_ptr_ptr;
    mov     bx,[bx];
    mov     ax,[bx];
    call    print_num  
为了打印7,我需要更改num1 ptr和num1_ptr_ptr的声明。我无法更改4行代码。我尝试将num1_ptr_ptr改为等于[num1_ptr],并将num1_ptr改为7。但这给了我0。 有人能帮我理解这里的逻辑吗? 我使用emu8086

我无法更改4行代码

我认为解决办法在于仔细阅读这些标签的名称

如果第一个标签的读数为static_num1_ptr,则很可能意味着它应该是指向num1的指针,而不是num1本身的值。
这里需要第三行:

static_num1         dw 7
static_num1_ptr     dw offset static_num1
static_num1_ptr_ptr dw offset static_num1_ptr
现在,您的4行代码

mov  bx, static_num1_ptr_ptr
mov  bx, [bx]
mov  ax, [bx]
call print_num

将正确地取消引用两次(
[bx]
)并打印值7。

请向我们显示进行了这些更改的代码。这是什么汇编程序语法?你是说emu8086吗?具有不同语法的不同汇编器可以为8086构建代码,例如NASM where
mov bx,static_num1_ptr_ptr
是一个
mov bx、imm16
或TASM,它是一个负载。我理解。是的,我是说emu8086我不认为你的代码是这样汇编的,这可能会导致执行上一次运行的二进制文件,从而导致你观察到的奇怪行为。你知道emu8086内置了调试器吗,这样你就可以看到代码是如何汇编的,寄存器和内存的内容是什么,在每次指令之后,它是如何变化的。尚不清楚
dw[static\u num1\u ptr]
将如何组装,可能是
dw offset static\u num1\u ptr
?从x86 ASM的角度来看,它没有任何意义,因此它是一种古怪/放松的emu8086语法(类似于MASM),这使得它可以编译,但它对人类来说是不可读的,这是程序员的意图。看起来可能有一个太多的取消引用(删除
mov bx,[bx]
help?)。将在调试器中显示。