c源码:testg.c

1 #include<stdio.h>     
         
2                                  

3 #define sum(a, b) a + b           

4                                   

5 int main(int argc,char
**argv)   

6 {                                

7     int num = sum(1,2);
        

8     printf("num =%d\n", num);  

9                                   

10     return0;                   

11
使用命令:gcc -S testg.c

寄存器:8位:al,ah

16位:ax

32位:eax

64位:rax 新增(r8-r15寄存器,低32位r8d-r15d,低16位r8w-r15w,低8位r8b-r15b)

操作符标示:8位:b

16位:w

32位:l

64位:q

1        .file   "testg.c"

2         .section        .rodata

3 .LC0:

4         .string "num = %d\n"

5         .text

6         .globl  main

7         .type   main, @function

8 main:

9 .LFB0:

10         .cfi_startproc

11         pushq   %rbp

12         .cfi_def_cfa_offset16

13         .cfi_offset6, -16

14         movq    %rsp, %rbp

15         .cfi_def_cfa_register6

16         subq    $32, %rsp

17         movl    %edi, -20(%rbp)

18         movq    %rsi, -32(%rbp)

19         movl    $3, -4(%rbp)

20         movl    -4(%rbp),
%eax

21         movl    %eax, %esi

22         movl    $.LC0, %edi

23         movl    $0, %eax

24         call    printf

25         movl    $0, %eax

26         leave

27         .cfi_def_cfa7,
8

28         ret

29         .cfi_endproc

30 .LFE0:

31         .size   main, .-main

32         .ident  "GCC: (GNU)5.1.0"

33         .section        .note.GNU-stack,"",@progbits 
    

linux系统中64位汇编和32位汇编的系统调用主要有以下不同:

(1)系统调用号不同.比如x86中sys_write是4,sys_exit是1;而x86_64中sys_write是1,
sys_exit是60。linux系统调用号实际上定义在/usr/include/asm/unistd_32.h和/usr/include/asm/unistd_64.h中。

(2)系统调用所使用的寄存器不同,x86_64中使用与eax对应的rax传递系统调用号,但是  x86_64中分别使用rdi/rsi/rdx传递前三个参数,而不是x86中的ebx/ecx/edx。

(3)系统调用使用“syscall”而不是“int 80”。

64位linux 汇编的更多相关文章

  1. MiniCRT 64位 linux 系统移植记录:64位gcc的几点注意

    32位未修改源码与修改版的代码下载: git clone git@github.com:youzhonghui/MiniCRT.git MiniCRT 64位 linux 系统移植记录 MiniCRT ...

  2. 64位linux报错Could not initialize class java.awt.image.BufferedImage

    最近碰到一个问题: 64位linux报错Could not initialize class java.awt.image.BufferedImage 在WIN平台下运行正常BufferedImage ...

  3. 在64位linux下编译32位程序

    在64位linux下编译32位程序 http://blog.csdn.net/xsckernel/article/details/38045783

  4. /usr/local/lib/libz.a: could not read symbols: Bad value(64 位 Linux)

    /usr/local/lib/libz.a: could not read symbols: Bad value(64 位 Linux) /usr/bin/ld: /usr/local/lib/lib ...

  5. 树莓派4B安装64位Linux(不用显示器键盘鼠标)

    入手了树莓派4B,我对它的定位是作为一个Docker实验环境,平时用到的镜像多为Java服务端常用的技术.以及自己作的Java应用镜像,因此宿主机需要64位操作系统,而树莓派官方操作系统只有32位的, ...

  6. 树莓派4B安装docker-compose(64位Linux)

    准备工作 树莓派4B已装好64位Linux,并且装好了19.03.1版本的Docker,具体的安装步骤请参考<树莓派4B安装64位Linux(不用显示器键盘鼠标)> 安装docker-co ...

  7. 64位Linux编译C代码,crt1.o文件格式不对的问题

    今天在某台64位LInux下编译一个简单的hello world的C程序,报错: /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../crt1.o: cou ...

  8. 64位linux下玩32位汇编编程

    利用下假期,打算把linux下的汇编语言给熟悉下,结果是以32位为版本的,只能在办公室的机器上跑了个opensuse的32位版本,家里的suse挂了,无法输入中文.打算再安装下32位系统,今天找到了个 ...

  9. 64位Linux安装32位向日葵

    查看linux系统版本信息如下,可以看出系统为64位. [root@localhost bin]# uname -aLinux localhost.localdomain 3.10.0-327.3.1 ...

随机推荐

  1. 【JAVA】cxf使用springboot与xml配置的差别所导致的问题。

    使用xml时使用以下配置使报文没有加上命名空间时也能正常访问接口.bean定义的前后顺序不影响程序正常注册对象. <!-- 通过Spring创建数据绑定的类 --> <bean id ...

  2. tcl之变量-unset 简单变量和数组

  3. 初识redis-cluster

    安装redis [root@localhost ~]# cd /datas/soft/ [root@localhost soft]# ll redis-.tar.gz // 已经下载的最新版 -rwx ...

  4. JZOJ 3383. 【NOIP2013模拟】太鼓达人

    3383. [NOIP2013模拟]太鼓达人 (Standard IO) Time Limits: 1000 ms  Memory Limits: 131072 KB  Detailed Limits ...

  5. python读取xls文件

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/10/17 14:41 # @Author : Sa.Song # @Desc ...

  6. 常州大学新生寒假训练会试 I 合成反应

    题目描述 有机合成是指从较简单的化合物或单质经化学反应合成有机物的过程. 有时也包括从复杂原料降解为较简单化合物的过程. 由于有机化合物的各种特点,尤其是碳与碳之间以共价键相连,有机合成比较困难,常常 ...

  7. PAT basic 1087

    1087 有多少不同的值 (20 分) 当自然数 n 依次取 1.2.3.…….N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取整函数,表示不超过 x 的最大自然 ...

  8. android基础知识杂记

    Activity中获取视图组件对象:public View findViewById(@IdRes int id) 该方法以组件的资源ID为参数,返回一个视图对象View,需要强转成具体的视图类对象. ...

  9. 【Reverse Nodes in k-Group】cpp

    题目: Given a linked list, reverse the nodes of a linked list k at a time and return its modified list ...

  10. Python之threading多线程

    1.threading模块是Python里面常用的线程模块,多线程处理任务对于提升效率非常重要,先说一下线程和进程的各种区别,如图 概括起来就是 IO密集型(不用CPU) 多线程计算密集型(用CPU) ...