【问题标题】:An array as a parameter of a function in 8086 assembly数组作为 8086 汇编中函数的参数
【发布时间】:2011-07-02 19:45:03
【问题描述】:

我想将字节数组(或指向该数组的指针)传递给 8086 程序集中的函数。

当我尝试PUSH 那个指针时,它给了我一个编译错误。错误是“错误的参数”。

org 100h

JMP Start  

Donnee DB 0ABh,0CDh,0EFh  

;; Principal program ;;
Start:

PUSH Donnee

CALL CalculeCRC  

POP CRC 

ret

【问题讨论】:

  • 我相信您明白,包含您在尝试组装此程序时收到的实际错误消息也是非常有帮助的。
  • 消息是错误并没有真正的帮助。不过,我已经编辑了我的问题。

标签: arrays assembly stack push x86-16


【解决方案1】:

PUSH 操作码需要一个 DWORD 值,在内存或寄存器中。在您的情况下,您正在尝试推送三个字节的数组。我认为,从技术上讲,这是有效的代码,但汇编器认识到它并不是真正想要的。 (如果您将另一个元素添加到字节数组中,可能有兴趣查看代码是否会组装,但这不是重点)。

无论如何,你想要做的并不是你想要发生的。您想在调用函数之前将指向数组的指针推入堆栈,而不是尝试将整个数组推入堆栈。即使汇编器让你这样做也会很糟糕,因为这会浪费内存。为了做您想做的事,您需要获取数组的地址并将其压入堆栈。可以使用LEA获取数组的“有效地址”:

lea eax, Donnee
push eax

你们可以做到以下几点:

push  OFFSET Donnee

【讨论】:

  • 请注意,PUSH immed 需要 80186 或更高版本(或 NEC V20 等兼容版本)。在原始 8086 指令集中不可用。
【解决方案2】:

我当然不是 8086 方面的专家,但我会阅读 PUSH 指令,看看它确实可以达到您的预期。

通过非常快速的检查,我认为它需要一个寄存器,所以你需要先将地址加载到一个寄存器中,然后再压入寄存器。

大概是这样的:

lea  ax, Donnee
push ax

这里可能存在标点符号和/或参数排序错误;我手边没有 8086 汇编器。

【讨论】:

  • 成功了,谢谢。问题不在于 PUSH 需要一个寄存器,而是它将 8 位值推入堆栈并且堆栈需要一个 16 位值。使用 LEA 可以找到数组的 16 位地址。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多