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

时间:2013-04-14 18:31:44

标签: 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 value of the second index of the array

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

1 个答案:

答案 0 :(得分:2)

基本上你还需要一个内存地址去引用(括号),但你的代码还有一些其他问题。

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

  1. 如果你将SI推入堆栈,你也应该弹出它
  2. 您正在将SI的值添加到CX但从不使用CX中的值
  3. 该过程不会还原调用者的BP和SP,也不会返回到调用过程的位置
  4. 以下是修复问题的代码:

    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