gpt4 book ai didi

c++ - x86-64 Linux NASM。在 C++ 文件中声明为函数的类型 int 数组的函数参数传递

转载 作者:太空狗 更新时间:2023-10-29 22:57:12 24 4
gpt4 key购买 nike

我尝试使用这个建议来解决这个问题

For Linux programming arr[], n, &a, &b are passed in RDI, RSI, RDX and RCX.

并且程序的输出没有正确地对数组中的整数求和。它输出一个明显错误的大数字。

下面找到的两个文件是从此处找到的原始 32 位版本修改而来的。 http://mcs.uwsuper.edu/sb/224/Intro/c_asm.html

我想要的是编译一个程序集文件,该文件调用名为 array.cpp 的 C++ 文件中的函数参数,然后将生成的目标文件 array.o 链接到g++

我遇到的问题要么与将正确的寄存器传递到堆栈有关,要么与为 rsi 寄存器上的每个偏移量添加的字节数有关(自从我使用 8每个堆栈元素都是 64 位)。

也可能是 rbp 寄存器未正确加载到数组地址元素数量的正确偏移处阵列。

 mov rcx, [rbp+24]   ; array length
mov rsi, [rbp+16] ; array address

无论如何,这是array.cpp 文件,下面是nasm 文件,我将其命名为nasm_cpp.asm

它们编译、链接和运行

nasm -f elf64 nasm_cpp.asm -o array.o
g++ -m64 array.cpp array.o
./a.out


#include <iostream>
using namespace std;

extern "C" int array(int a[], int length); // external ASM procedure

int main()
{
int a[] = { 10, 10}; // array declaration
int array_length = 2; // length of the array

int sum = array(a, array_length); // call of the ASM procedure

cout << "sum=" << sum << endl; // displaying the sum
}

这是下面的nasm_cpp.asm

;nasm -f elf64 nasm_cpp.asm -o array.o
;g++ -m64 array.cpp array.o
;./a.out
global array ; required for linker and NASM
section .text ; start of the "CODE segment"

array: push rbp
mov rbp, rsp ; set up the rBP
push rcx ; save used registers
push rdi
push rsi

mov rcx, [rbp+24] ; array length
mov rsi, [rbp+16] ; array address

xor rax, rax ; clear the sum value
lp: add rax, [rsi] ; fetch an array element
add rsi, 8 ; move to another element
loop lp ; loop over all elements

pop rsi ; restore used registers
pop rdi
pop rcx
pop rbp
ret ; return to caller

最佳答案

我遵循了问题下方评论中的建议,现在可以使用了,cpp 文件与上面相同。

;nasm -f elf64 nasm_cpp.asm -o array.o
;g++ -m64 array.cpp array.o
;./a.out
global array ; required for linker and NASM
section .text ; start of the "CODE segment"

array:
push rbp
mov rbp, rsp ; set up the rBP

mov rcx, rsi ; array length
mov rsi, rdi ; array address

xor rax, rax ; clear the sum value
lp: add eax, [rsi] ; fetch an array element
add rsi, 4 ; move to another element
loop lp ; loop over all elements

pop rbp

ret ; return to caller

关于c++ - x86-64 Linux NASM。在 C++ 文件中声明为函数的类型 int 数组的函数参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45619224/

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