首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >X86装配问题

X86装配问题
EN

Stack Overflow用户
提问于 2017-06-03 21:47:22
回答 1查看 283关注 0票数 1

我正在尝试阅读一本关于X86的书,这本书是用VisualC++和Visual的例子编写的。我正试着把这些例子转换成gcc用的。在经历了许多问题之后,我终于得到了至少可以编译的代码,但是现在我得到了分段错误。下面是代码:

集合.s:

代码语言:javascript
复制
.intel_syntax noprefix
.section .text
.globl CalcSum
.type CalcSum, @function
// extern "C" int CalcSum_(int a, int b, int c)
CalcSum:

// Initialize a stack frame pointer
    pushq rbp
    mov ebp,esp

// Load the argument values
    mov eax,[ebp+8]
    mov ecx,[ebp+12]
    mov edx,[ebp+16]

// Calculate the sum
    add eax, ecx
    add eax, edx

// Restore the caller's stack frame pointer
    popq rbp
    ret

测试.c:

代码语言:javascript
复制
#include <stdio.h>

extern int CalcSum(int a, int b, int c);

int main() {
   int sum = CalcSum(5,6,7);
   printf(" result: %d\n",sum);
   return 0;
}

我正在使用gcc -o execute test.c assembly.s进行编译。如果我将所有32位指令更改为64位(即ebprbp),它将运行,但会提供完全随机的输出。有人能指出我在这里做错了什么吗?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-04 10:59:20

正如评论中所暗示的那样,这是一个电话会议的问题。在Windows和Linux中,32位C函数遵循CDECL calling convention .在64位Linux中,您必须使用System V AMD64 ABI64-bit calling convention of Windows是不同的。可能会有使用操作系统功能的具体细节。

32位C (GCC):

代码语言:javascript
复制
.intel_syntax noprefix
.section .text
.globl CalcSum
.type CalcSum, @function
// extern "C" int CalcSum_(int a, int b, int c)
CalcSum:     // with underscore in Windows: _CalcSum

// Initialize a stack frame pointer
    push ebp
    mov ebp,esp

// Load the argument values
    mov eax,[ebp+8]
    mov ecx,[ebp+12]
    mov edx,[ebp+16]

// Calculate the sum
    add eax, ecx
    add eax, edx

// Restore the caller's stack frame pointer
    pop ebp
    ret

64位Linux (GCC):

代码语言:javascript
复制
.intel_syntax noprefix
.section .text
.globl CalcSum
.type CalcSum, @function
// extern "C" int CalcSum_(int a, int b, int c)
CalcSum:

// Load the argument values
    mov rax, rdi
    add rax, rsi
    add rax, rdx

    ret

64位视窗(明威-GCC):

代码语言:javascript
复制
.intel_syntax noprefix
.section .text
.globl CalcSum
// .type CalcSum, @function
// extern "C" int CalcSum_(int a, int b, int c)
CalcSum:

// Load the argument values
    mov rax, rcx
    add rax, rdx
    add rax, r8

    ret
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44348838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档