AT&T汇编之32位与64位系统调用

Linux asm系统调用:32位和64位的区别 最近在学习系统调用,一段用asm内联汇编写的简单程序始终得不出正确的系统调用结果。经过提醒,我才了解到这是32位平台和64位平台的系统调用方法不同的原因。在此列出相关的程序和我的理解。 阅读详情

查看系统调用号

locate unistd_64

less /usr/include/x86_64-linux-gnu/asm/unistd_64.h

Linux 32位系统调用和64位系统调用的区别

  • 系统调用号不同。如sys_write在32位下是4,在64位下是1。
  • 调用方法不同。我们在32位下用int 80H中断进行系统调用,而64位下需要用syscall指令进行系统调用。
  • 传参方式不同。32位程序,我们将系统调用号传入eax,调用参数按照ebx,ecx,edx的顺序写入寄存器,系统调用返回值写入eax寄存器。而64位程序,系统调用号传入rax,而各个参数按照rdi,rsi,rdx的顺序写入寄存器,系统调用返回值写入rax。

HelloWorld程序

我们的目的是在屏幕上输出HelloWorld,在标准输出上写入该字符串即可。
使用sys_write系统调用,我们可以man 2 write,查看write的传参。

也可以直接查看内核syscall头文件:

root@wilcohuang:/usr/src# cat linux-headers-4.4.0-91/include/linux/syscalls.h | grep -C 1 'sys_write'
                          unsigned long vlen);
asmlinkage long sys_write(unsigned int fd, const char __user *buf,
                          size_t count);

第一个参数是文件描述符,第二个参数数字符串地址,第三个参数是字符串长度。

有了这些,下面通过两个例子来展示32位和64位系统调用

32位

在64位环境下运行32位汇编,需要搞一些事情:

使用如下命令才能汇编:

root@wilcohuang:/data/home/wilcohuang/test-asm# as -32 -gstabs -o syscall_32.o syscall_32.asm
root@wilcohuang:/data/home/wilcohuang/test-asm# ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -lc -o syscall_32 syscall_32.o

如果你使用了上面了命令汇编完成后,执行程序报:-bash: ./syscall: cannot execute binary file: Exec format error
呵呵,我猜你肯定用了坑爹的WSL:)

root@wilcohuang:/data/home/wilcohuang/test-asm# c
    ;.code32  (这句可加可不加)                  
    .section .data                               
message:                                         
    .ascii "Hello, World!\n"                     
    length = . - message                         
    .section .text                               
    .global _start                               
_start:                                          
    mov $4, %eax                                 
    mov $1, %ebx                                 
    mov $message, %ecx                           
    mov $length, %edx                            
    int $0x80                                    
                                                 
    mov $1, %eax                                 
    xor %ebx, %ebx                               
    int $0x80                                                         

64位

    .section .data           
message:•                    
    .ascii "Hello, World!\n" 
    length = . - message     
    .section .text           
    .global _start           
_start:                      
    nop                           
    mov $0x1, %rax           
    mov $0x1, %rdi           
    mov $message, %rsi       
    movq $length, %rdx       
    syscall                  
                             
    mov $0x3c, %rax          
    xor %rdi, %rdi           
    syscall                  

扩展 rip相对寻址

在x86-64模式下,新增了rip相对寻址的功能,这是为了更方便的产生地址无关的代码。

所以,取message的地址也可以像下面这样:

     .section .data                
 message:•                         
     .ascii "Hello, World!\n"      
     length = . - message          
     .section .text                
     .global _start                
 _start:                           
     nop                           
     mov $0x1, %rax                
     mov $0x1, %rdi                
     lea message(%rip), %rsi       
     movq $length, %rdx            
     syscall                       
                                   
     mov $0x3c, %rax               
     xor %rdi, %rdi                
     syscall                       

ok,今天到此位置,回家睡觉。

x86_64汇编之六:系统调用(system call) 本文将主要讲述如何在汇编语言代码中调用Linux的系统调用。 一、32位系统的系统调用 在32位x86 Linux系统中,可用的系统调用定义在/usr/include/asm/unistd_32.h头文件中。 每个系统调用都对应一个编号 以及 若干个参数。如果想使用汇编语言调用系统调用,那么在调用之前,需要将系统调用编号存到%eax,将参数依次存到%ebx, %ecx, %edx, %esi, %edi, %ebp中,然后再执行int $0x80指令即可。 每个系统调用的编号和参数列表可以参考:https: 阅读详情

相关推荐

64位Centos7上汇编运行32位程序

64位Centos7上汇编运行32位程序首先贴上源代码。 .ld-linux.so.2是动态加载器用来查找libc.so的

liushihuidfg的博客 4431

Linux x86_64 汇编语言的编写

Linux x86_64 汇编语言输出 helloworld 的编写

小立仔 2737

LuaJit分析(四)luajit 64位与32位字节码区别

luajit 64位和32位字节码不一样,体现:1、文件头部的flags表示,64位中有标记 fr2 = 12、原型头中的栈帧大小,当原型中有call指令并有参数时,frame大小会比32位的加13、参数压入的位置,当存在call指令并且有KSTR等指令压入参数时,压入的位置会加14、原因是CALL调用时需要保存返回地址,在32位中,地址占4字节,直接覆盖了栈中压入的函数字段类型的类型部分(4字节),而64位中地址占8字节,因此将栈的大小增加了1,并移动所有参数。

a545958498的博客 1972

64位和32位的寄存器和汇编的比较

64位寄存器分配的不同 区别有: 64位有16个寄存器,32位只有8个。但是32位前8个都有不同的命名,分别是e _ ,而64位前8个使用了r代替e,也就是r _。e开头的寄存器命名依然可以直接运用于相应寄存器的低32位。而剩下的寄存器名则是从r8 - r15,其低位分别用d,w,b指定长度。 32位使用栈帧来作为传递的参数的保存位置,而64位使用寄存器,分别用rdi,rsi,rdx,rcx,r

jmp esp 3万+

Linux 64位系统下的AT&T汇编调用C语言printf函数

市面上大多数的汇编代码都是32位的。很少有Linux 64位 AT&amp;T的。<汇编语言程序设计>这里面的例子大部分也是32的。想要64位的例子需要自己研究,调试。 书本上的例子如下: .section.data output: .string"TheProcessorVendorIDis'%s'\n" .section.bss .lcommbuffer,12 .section.text .global_start _st...

noky的专栏 784

64位与32位汇编除法技术实现与应用

64位处理器能够处理更大的数据宽度,同时支持更大的内存寻址空间,理论上能够一次处理比32位处理器多出一倍的数据。这使得64位处理器在运行多任务以及处理大数据时更加高效。汇编语言是一种低级编程语言,它与机器语言非常接近,但采用了可读性更强的符号和助记符来表示机器指令。每条汇编指令几乎都与特定的机器指令一一对应。汇编语言的特性包括直接控制硬件的能力、极高的执行效率和对系统底层资源的精细操作。由于其接近硬件的本质,编写汇编语言的程序员必须具备对计算机内部工作机制和指令集架构的深刻理解。

weixin_42571280的博客 1149

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传递系统调用号,但是

zyx4843的专栏 2905

编码约定的自由度:重新思考Hamming码在实际工程中的灵活应用

本文探讨Hamming码在实际工程中的灵活应用,突破标准实现的思维定式。通过分析不同编码约定的优缺点和资源受限环境下的设计权衡,展示如何根据嵌入式系统、通信协议等具体需求定制汉明码实现,优化编解码效率并降低硬件开销。

perl8的博客 177

GCC中的内联汇编语言

一.声明    虽然Linux的核心代码大部分是用C语言编写的,但是不可避免的其中还是有一部分是用汇编语言写成的。有些汇编语言代码是直接写在汇编源程序中的,特别是Linux的启动代码部分;还有一些则是利用gcc的内嵌汇编语言嵌在C语言程序中的。这篇文章简单介绍了gcc中的内嵌式汇编语言,主要想帮助那些才开始阅读Linux核心代码的朋友们能够更快的入手。 写这篇文章的主要信息来源是GNU的两个i

1075

阿里云Ubuntu部署Steam饥荒联机版服务器:从零到多人联机的完整指南

本文详细介绍了在阿里云Ubuntu系统上部署Steam饥荒联机版服务器的完整流程,包括环境准备、SteamCMD安装、服务端配置、Mod管理及后台运行技巧。通过2核4GB的ECS实例配置和端口设置,实现5人流畅联机体验,适合游戏爱好者快速搭建专属服务器。

weixin_29229261的博客 1023

K型热电偶分度表读取方法

K型热电偶分度表读取方法

guaizaiguaizai的博客 5888

0x86汇编指令

0x86汇编指令

ccjiangdian的博客 2096

AGM Supra软件从零到一:国产CPLD工程创建全流程拆解

本文详细拆解了AGM Supra软件从零开始创建国产CPLD工程的全流程,包括开发环境配置、工程创建、Quartus项目转换、TCL脚本执行与编译等关键步骤。特别强调了中文路径避坑、器件型号选择等实用技巧,帮助开发者高效完成CPLD开发任务。

weixin_29158413的博客 410

Hello World——Linux汇编

采用AT&T语法。 32位:   1 .section .text  2 .global _start  3  4 msg:  5     .ascii "Hello World!/n"  6 msg_end:  7     .equ len, msg_end - msg  8     .equ SYS_write, 4  9     .equ SYS_exit, 1

SprintfWater的专栏 1168

保姆级教程:Win10/Win11系统下ArcGIS 10.2中文版完整安装与破解(含License Manager启动失败解决方案)

本文提供Windows 10/11系统下ArcGIS 10.2中文版的完整安装与破解教程,重点解决License Manager启动失败等常见问题。从安装准备、破解文件处理到最终配置验证,详细指导用户完成每一步操作,确保软件正常运行。特别针对主机名修改、端口占用等疑难问题提供专业解决方案。

weixin_29596051的博客 535

操作系统实验四 进程运行轨迹的跟踪与统计(哈工大李治军)

实验4 进程运行轨迹的跟踪与统计 实验目的 掌握 Linux 下的多进程编程技术; 通过对进程运行轨迹的跟踪来形象化进程的概念; 在进程运行轨迹跟踪的基础上进行相应的数据统计,从而能对进程调度算法进行实际的量化评价,更进一步加深对调度和调度算法的理解,获得能在实际操作系统上对调度算法进行实验数据对比的直接经验。 实验内容 进程从创建(Linux 下调用 fork())到结束的整个过程就是进程的生命期,进程在其生命期中的运行轨迹实际上就表现为进程状态的多次切换,如进程创建以后会成为就绪态;当该进程被调度以

leoabcd12的博客 4651

32位和64位到底有什么区别?

目录 从代码到到可执行文件 从可执行文件到进程 CPU位数的含义 系统和软件的位数的含义 程序数值int32和int64的含义 系统位数会限制内存吗? 总结 关于32位和64位,这个概念一直让人比较懵。 在买电脑的时候,我们看到过32位和64位CPU。 下软件的时候,我们也看到过32位或64位的软件。 就连装虚拟机的时候,我们也看过32位和64位的系统。 在写代码的时候,我们的数值,也可以定义为int32或者int64。 我们当然很清楚,装软件的时候,一般64位的系统就选64位的软

ThinPikachu的博客 2万+

orange软件:入门使用

orange做数据分析契机实验手册目录orange软件部分界面展示小试牛刀:数据导入和展示小试牛刀:散点图绘制总结 契机 今天在上大数据时代实验课,作为一名软件工程专业的大三学生,在上这节公选课之前就决定这节课做完这个学期所有的实验报告,可以说“有亿点”不屑;尤其当老师说Python很麻烦的时候,我更是震惊了,因为我接触过这么多编程语言,Python真的很友好了,很傻瓜,但是当老师打开实验手册的时候,我真香了!!!下面先来看看手册的目录: 实验手册目录 为什么会真香呢,因为目录里这些有好多机器学习算法!

weixin_45880844的博客 1万+

关于AT&T 汇编:64 位之于32 位的变化

换了64 位的系统,然后最近用了一下as,发现调用C 库直接不行了。 查了下貌似64 位的AT&T 汇编和32 位的已经有很大的不同: 1. 函数调用不再采用压栈的方式: 下面的内容摘自WikiPedia: The first six integer or pointer arguments are passed in registers RDI, RSI, RDX, RCX,

河 的 第 三 条 岸 3893

STEP 7-Micro/WIN SMART 编程软件:从入门到精通的使用指南

通过不断实践,熟悉软件的各项功能和操作技巧,工程师可更好地应对工业自动化控制中的各种挑战,开发出高效、稳定的控制程序。项目的基本组件是构成程序的核心元素,包括:程序块(主程序 OB1、子程序和中断程序)、数据块(给 V 存储器赋初值)、系统块(硬件组态和参数设置)、符号表(用符号代替存储器地址,使程序更易理解)以及状态图表(监视、修改和强制变量状态)。下载程序时,单击工具栏上的 “下载” 按钮,在弹出的下载对话框中选择要下载的块(程序块、数据块、系统块),单击 “下载” 即可。

电工 5569

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

x86_64汇编之一:AT&T汇编语法

汇编语法主要有两大派系:AT&amp;T语法 和 Intel语法。 GAS (GNU Assembler) 编译器默认是基于AT&amp;T语法;MASM、NASM等编译器默认基于Intel语法。 需要说明的是,GAS汇编器除了支持AT&amp;T语法之外,自己也定义了一些额外的directives,用于辅助完成汇编操作。关于GAS汇编器及其语法可以参考GAS的官方文档:https://sourceware.org/binutils/docs/as/ 由于AT&amp;T语法在Linux平台上使用比较广泛,

qq_29328443的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

AT&T汇编入门[0] hello world

x86汇编有intel和AT&T两种语法,网上资料使用intel语法的相对多一些,但是在linux平台的GNU汇编器用的是AT&T语法,本篇记录一下AT&T格式汇编程序的hello world。

Aruko的博客 2291

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

32位、64汇编区别

我在VS使用反汇编看到的依然是32位汇编。   1. 寄存器 64位有16个寄存器,32位只有8个。但是32位前8个都有不同的命名,分别是e _ ,而64位前8个使用了r代替e,也就是r _。e开头的寄存器命名依然可以直接运用于相应寄存器的低32位。而剩下的寄存器名则是从r8 - r15,其低位分别用d,w,b指定长度。 32位使用栈帧来作为传递的参数的保存位置,而64位使用寄存器,分别用...

墨痕诉清风的博客 6043

【二进制安全作业】64位 系统调用 案例研究

前一面讲解了C语言中编写汇编代码的语法以及系统调用的概念,并进行了32位程序的相关分析,这一篇继续上一篇,分析64位程序。以上就是本篇的分享内容,欢迎交流讨论。

一个博客 2105

64位ubuntu20.04上编译32位汇编程序,并连接C库函数

要解决的问题如下: /usr/bin/ld: 当搜索用于 /usr/lib/x86_64-linux-gnu//libc.so 时跳过不兼容的 -lc 或者在连接的时候ld提示 ld: i386:x86-64 architecture of input file `multest.o’ is incompatible with i386 output 或者编译生成可执行文件运行后提示 bash: ./multest: 正在访问一个已毁坏的共享库。 我的系统是64位的ubuntu20.04。 汇编

zhaopeng01zp的博客 4977
上一篇: 性能工具perf的用法以及如何绘制性能火焰图
下一篇: AT&T汇编之使用C库函数
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值