首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows x64上不同的asm与CS:appx86-64linux示例函数用于交换一个长的

Windows x64上不同的asm与CS:appx86-64linux示例函数用于交换一个长的
EN

Stack Overflow用户
提问于 2019-03-21 06:22:04
回答 1查看 198关注 0票数 0

我正在阅读CS:APP第三版(Ch3 )。PIC3.7气体装配代码)

代码语言:javascript
复制
long exchange(long* xp, long y)
{
  long x = *xp;
  *xp = y;
  return x;
}

exchange:
    movq  (%rdi), %rax
    movq  %rsi, (%rdi)
    ret

我想知道为什么下面的汇编代码(1.ASM:转换为nasm)不能工作?

我已经使用c2nasm将工作c函数分解成nasm汇编源代码。它与原来的装配完全不同。

main.cpp:

代码语言:javascript
复制
int main()
{
  long a = 4;
  // long b = exchange(&a, 3);
  long b = exchange2(&a, 3);

  printf("[a: %ld] [b: %ld]\n", a, b);

  return 0;
}

1.asm:

代码语言:javascript
复制
BITS 64

; default rel
default abs 

global    exchange2 
section   .text

exchange2:
    ;;; this code does not works
    ;;; program output    ->        [a: 4] [b: 0]
    mov rax, [rdi]
    mov [rdi], rsi 
    ret

    ;;; this code works, generated by c2nasm.
    ;;; program output    ->        [a: 3] [b: 4]
    ; push    rbp
    ; mov     rbp, rsp
    ; sub     rsp, 16
    ; mov     qword [rbp+10H], rcx
    ; mov     dword [rbp+18H], edx
    ; mov     rax, qword [rbp+10H]
    ; mov     eax, dword [rax]
    ; mov     dword [rbp-4H], eax
    ; mov     rax, qword [rbp+10H]
    ; mov     edx, dword [rbp+18H]
    ; mov     dword [rax], edx
    ; mov     eax, dword [rbp-4H]
    ; leave
    ; ret

编辑:谢谢!

Windows x64 long long exchange(long long*, long long)的工作版本

代码语言:javascript
复制
BITS 64

default rel

global    _exchange2     ; Windows name-mangling prepends _ to C names
section   .text

_exchange2:
    mov rax, [rcx]
    mov [rcx], rdx 
    ret
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-21 06:32:14

您的示例是x86-64系统V,用于Linux、OS和其他非Windows平台( RDI中的64位long、args、RSI、.)

您是为Windows编译的,它使用了不同的调用约定( RCX中的args,RDX中的args),而long是32位类型。

此外,您在编译时禁用了优化,因此asm充满了存储/重新加载噪声。通过优化,它基本上是相同的,但是有不同的寄存器。

顺便说一句,您可以使用gcc -O3 -masm=intel来获得英特尔语法程序集,它更接近于NASM语法。(这不是NASM语法;它类似于MASM,用于寻址模式,并且仍然使用GAS指令。)

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

https://stackoverflow.com/questions/55274794

复制
相关文章

相似问题

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