Assembly 当我有第一个索引的地址时,如何在x86程序集中获取数组元素的值

Assembly 当我有第一个索引的地址时,如何在x86程序集中获取数组元素的值,assembly,x86,Assembly,X86,我需要在C程序中调用汇编过程。在我的C程序中,我有一个数组的地址,在我的汇编程序中,我需要获得数组第二个索引的值。如果将数组本身作为参数,对我来说会更容易。您能告诉我如何获取数组第二个元素的内容吗 在我的C程序中,我调用此函数: getIndex(&array[0]); 如果参数不是地址,我在组装过程中的解决方案是: PUSH BP MOV BP,SP push SI MOV SI,[BP+4] ADD CX,SI ADD SI,2 MOV AX,SI ; AX got the

我需要在C程序中调用汇编过程。在我的C程序中,我有一个数组的地址,在我的汇编程序中,我需要获得数组第二个索引的值。如果将数组本身作为参数,对我来说会更容易。您能告诉我如何获取数组第二个元素的内容吗

在我的C程序中,我调用此函数:

getIndex(&array[0]);  
如果参数不是地址,我在组装过程中的解决方案是:

PUSH BP
MOV BP,SP
push SI

MOV SI,[BP+4]
ADD CX,SI
ADD SI,2
MOV AX,SI ; AX got the value of the second index of the array

我该如何解决我的问题?感谢您的帮助。

基本上您还需要一个内存地址取消引用(括号),但代码中还有一些其他问题

查看您的代码,我假设数组中元素的大小为2字节,您使用的是调用约定,并且有一个16位处理器。以下是问题:

  • 如果将SI推到堆栈中,还应该将其弹出
  • 您正在将SI的值添加到CX中,但从未使用CX中的值
  • 该过程不会还原调用方的BP和SP,也不会返回调用该过程的位置
  • 以下是已修复问题的代码:

    push bp
    mov bp,sp
    push si
    mov si,[bp+4] ; si = address of the first element in the array
    mov ax,[si+2] ; ax = value of the second element in the array
    pop si        ; revert si
    mov sp,bp     ; revert the caller's stack pointer
    pop bp        ; revert the caller's base pointer
    ret           ; jump to the instruction after the call
    

    [ax+2]
    [sp+2]
    是无效的内存操作数。你不能在这里使用这些寄存器。请参阅CPU文档。谢谢@Alexey!今天晚些时候有时间时,我必须更正我的答案。参考8086用户手册后,我认为代码现在应该是有效的。谢谢大家的回答:)