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 wheremov 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?)。将在调试器中显示。