gpt4 book ai didi

c - 如何在汇编器中访问数组的一个元素

转载 作者:行者123 更新时间:2023-11-30 19:38:40 27 4
gpt4 key购买 nike

我需要你的帮助...实际上,我正在从事我的学术项目,并且正在努力完成它。但我不知道如何在汇编程序中访问一个数组的一个元素。

我的想法是从C调用函数汇编器,同时传递参数。例如

float* calc(int n, int d, float*data){
float* result = _mm_malloc(sizeof (float)*n*d, 16);
calc_x86_asm(n, d, data, result)
//Line edited, I forget to put the return
return result;
}

函数 calc_x86_asm 在文件的开头声明。

extern calc_x86_asm(int n, int d, float* data, float* result);

我的函数有以下内容:

;External asm function
extern calculate_value
section .text ;program
n equ 8
d equ 12
data equ 16
rta equ 20

global calc_x86_asm ;for linux

calc_x86_asm:
;Initialize a stack frame
push ebp
mov ebp, esp
pushad
.body:
;Load information
mov ebx, [ebp+rta]
;Initialization counters
xor edx, edx
.loop:
cmp edx, [ebp+n] ; if(ecx < n){
jz .done ; goto .done
; else
push dword [ebp+d] ; d
push dword [ebp+n] ; n
push dword [edx] ; current_row
push dword [ebp+data] ; data to evaluate
call calculate_value
add esp, 16 ; restore stack after to call function.
mov [ebx+edx*4], eax ;<<< Here the problem
add edx, 1
jmp .loop
.done:
.done:
;Pop registries
popad
;Restore the call's stack frame pointer
pop ebp ; restore ebp
ret

真的,我不知道我是否以正确的形式在数组内存中进行值分配。因为当我运行我的项目时,应用程序会让我出错。顺便说一下,calculate_value 是一个 C 函数。

在 C 中将采用以下形式:

for(int i=0; i<n; i++){
result[i] = calc(n, d, i, data);
}

最佳答案

您的问题是,您在仔细设置寄存​​器后调用 C 函数:C 函数将肯定覆盖它们。在调用该函数之前,您需要保存重要的寄存器:

push ebx ; Save for later
push edx ; Save for later

push dword [ebp+d] ; d
push dword [ebp+n] ; n
push dword [edx] ; current_row
push dword [ebp+data] ; data to evaluate
call calculate_value
add esp, 16 ; restore stack after to call function.

pop edx ; It's later! (Note reversed restore...)
pop ebx ; It's later!

但是这整个

  • 设置您的寄存器;
  • 保存它们
  • 调用 C
  • 恢复寄存器
  • 返回了解更多

首先完全消除了使用汇编的需要:您还不如用 C 编写整个内容。

关于c - 如何在汇编器中访问数组的一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37700783/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com