【问题标题】:Work with addresses in assembly在程序集中使用地址
【发布时间】: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


【解决方案1】:

我无法更改 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。

【讨论】:

    猜你喜欢
    • 2013-05-16
    • 2011-07-02
    • 2023-03-22
    • 2013-05-23
    • 1970-01-01
    • 2020-05-17
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多