【发布时间】:2017-11-08 17:53:48
【问题描述】:
所以我无法弄清楚为什么我的程序不起作用以及不同输入的不同输出。我有 2 个变量:
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
我需要更改 num1-ptr 和 num1_ptr_ptr 的声明才能打印 7。我无法更改 4 行代码。我尝试将 num1_ptr_ptr 更改为等于 [num1_ptr] 并将 num1_ptr 更改为 7。但这给了我 0。 有人可以帮我理解这里的逻辑吗? 我用的是emu8086
【问题讨论】:
-
请向我们展示进行这些更改的代码。这是什么汇编语法?
-
你是说emu8086吗?具有不同语法的不同汇编器可以为 8086 构建代码,例如
mov bx,static_num1_ptr_ptr;是mov bx, imm16的 NASM,或者是负载的 TASM。 -
我明白了。是的,我的意思是emu8086
-
我不认为你的代码是这样组装的,这可能会导致之前运行的二进制文件被执行,从而导致你观察到的奇怪行为。
-
你知道emu8086有内置的调试器,所以你可以看到代码是如何汇编的,寄存器和内存的内容是什么,以及在每条指令之后它是如何变化的。目前尚不清楚
dw [static_num1_ptr]将如何组装,可能是dw offset static_num1_ptr?从 x86 ASM 的角度来看,它没有任何意义,所以它是古怪/宽松的 emu8086 语法(类似于 MASM),这使它可以编译,但它对人类来说是不可读的,程序员的意图是什么。看起来可能有太多的取消引用(删除mov bx,[bx]有帮助吗?)。在调试器中会很明显。
标签: assembly x86 x86-16 emu8086