《汇编语言程序设计》例子出现segmentation fault

news2024/12/26 22:06:10

        照着例子抄写了一下,直接用的 gcc 编译,源码如下,因为不支持 pushl,所以改成了 pushq

#cpuid.s View the CPUID Vendor ID string using C library calls
.section .data
output:
	.asciz "The processor Vendor ID is %s \n"

.section .bss
	.lcomm buffer, 12
	
.section .text
.global main
main:
	MOVL $0, %eax
	cpuid
	MOVL $buffer, %edi 	
	MOVL %ebx, (%edi)
	MOVL %edx, 4(%edi)
	MOVL %ecx, 8(%edi)
	
	pushq $buffer
	pushq $output
	call printf
	addl $8, %esp
	pushq $0
	call exit

如果使用 pushl 的话,在x86_64 位下不支持,如下错误信息:

 网上搜索到解决办法有 2 种,一种是在源码开头添加.code32 告诉编译器按照32位进行编译,另外一种是使用 pushq,q 即为 quad word 表示 8 字节长度的,即 64 位。编译通过后,运行时出现 segmentation fault。网上搜了很多,没有一样的,但很多相似的在调用 printf 的时候出现 segmentation fault,这个跟调用约定有关系,64 位和32 位还不一样,64 位下是通过寄存器和栈来传递参数的,而 32 位下则是通过栈来传递参数的。看上面的代码 pushq $buffer 和  pushq $output 就是入栈操作,而在 64 位下:整数参数(包含指针)依次放在 %rdi, %rsi, %rdx, %rcx, %r8, 和 %r9 寄存器中,如果调用的是可变参数的函数(比如printf), 寄存器%eax需记录下浮点参数的个数,找到一段可用的代码,修改如下:

.section .data
output:
	.string "The processor Vendor ID is %s \n"

.section .bss
	.lcomm buffer, 32
	
.section .text
.global main
main:
	MOVL $0, %eax
	cpuid
	MOVL $buffer, %edi 	
	MOVL %ebx, (%edi)
	MOVL %edx, 4(%edi)
	MOVL %ecx, 8(%edi)
	
	MOVQ $output, %rdi	#需要用MOVQ 来操作64bit寄存器
	MOVQ $buffer, %rsi	#同上
	MOVQ $0, %rax		#同上
	
	pushq %r10
	pushq %r11
	
	call printf

	popq %r11
	popq %r10
	
	ret

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1830972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

揭秘:边缘智能网关P1600在智慧灯杆上的应用

智慧灯杆作为智慧城市建设的重要组成部分,集成了照明、通信、安防、环境监测等多重功能,是实现城市智能化的关键载体。边缘智能网关P1600在这一系统中扮演着至关重要的角色,它不仅连接和管理各种传感器和设备,还负责数据的采集、处…

python操作注册表没有权限(error:5拒绝访问)

在IDE中运行 1. Openkey( , , accesswinreg.KEY_ALL_ACCESS) 2. 管理员方式运行Vscode或PyCharm 如果要打包成应用呢? 怎么处理权限问题?

从Instance classifier重新思考多实例学习

弱监督的WSI分类通常被形式化为多实例学习(MIL)问题,其中每张slide都被视为一个bag,从中切出的patch被视为实例。现有的方法要么通过伪标记训练实例分类器,要么通过注意力机制将实例特征聚合为bag特征,然后…

【递归、搜索与回溯】综合练习二

综合练习二 1.组合2.目标和3.组合总和4.字母大小写全排列 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.组合 题目链接:77. 组…

电脑剪贴板历史记录查看,让你的信息管理更加有序!

剪贴板是电脑中一个非常实用的功能,允许用户在不同的应用程序之间复制和粘贴文本、图像、文件等内容。然而,默认情况下,剪贴板只能存储最近一次复制的内容,这可能会限制我们的工作效率。幸运的是,电脑剪贴板历史记录查…

MySQL中实现行列转换的示例

在 MySQL 中进行行列转换(即,将某些列转换为行或将某些行转换为列)通常涉及使用条件逻辑和聚合函数。虽然 MySQL 没有像 Oracle/SQL Server 中的 PIVOT 和 UNPIVOT 那样的直接功能,但你可以通过结合 CASE 语句、UNION 或 UNION AL…

c语言哈夫曼中英文混合编码

一.需求文档 c语言实现哈夫曼编码 1.中文编码 2.英文编码 3.中英文混合编码 4.从文件读取进行编码 5.编码生成编码文件 6.从生成的编码文件进行解码 二.运行截图

香港优才计划中介避坑,深圳哪家优才中介有实力?

随着香港优才计划取消配额限制以来,优才计划递交申请量骤增,许多DIY的申请人在递交申请后,长时间未能收到审批结果,甚至有人等待了12个月之久仍对审批进展一无所知。 而一些有中介协助的申请人,在等待审批的过程中&am…

如何在WIndows虚拟机安装 macOS 黑苹果系统?

在本教程中,我们将介绍如何在虚拟机上安装 macOS 黑苹果系统。黑苹果系统是非苹果公司官方支持的 macOS 系统的非官方版本,可以在普通 PC 上运行。请注意,安装黑苹果系统可能违反苹果的许可协议,请自行承担风险。参考视频教程&…

二、C#基本语法

C#是一种面向对象的编程语言。在面向对象的程序设计方法中,程序由各种相互交互的对象组成。相同种类的对象通常具有相同的类型,或者说,是相同的class中。 例如,以rectangle(矩形)对象为例。它具有length和…

有声读物管理平台Booksonic-Air

老苏最近在听评书,所以想找个软件来管理和收听,找了一圈,感觉 Booksonic-Air 可能能满足老苏的需求。 什么是 Booksonic-Air ? Booksonic-Air 是一个用于流式传输有声读物的服务器,是原始 Booksonic 服务器的后继者。…

docker镜像拉取K8s的calico,Pod报错Init:ImagePullBackOff及kubekey生成离线包报错error: Pipeline[ArtifactExportpipe的解决

配置k8s集群出现问题 起初以为是版本问题,最后比对了一下发现没有问题。使用 kubectl describe calico-node-mg9xh -n kube-system命令查看发现docker pull 镜像失败,但是docker国内镜像源早就配置过了。 猜测Docker的缓存可能会导致拉取镜像失败。尝试…

深入探究MySQL的B+树索引

一、索引概述 在MySQL中,索引是一种数据结构,它可以帮助数据库系统更快地检索数据。索引可以比作一本书的目录,它可以让我们不必翻阅整本书就能找到所需的信息。没有索引,MySQL必须从头到尾扫描整个表来找到相关的行,…

Hack The Box-Editorial

总体思路 SSRF->敏感信息泄露->CVE-2022-24439 信息收集&端口利用 nmap -sSVC editorial.htb目标机器开放22、80和1027端口,这里先查看80端口 进去后是一个图书收集界面,对网站进行扫描 dirsearch -u http://editorial.htb逐一访问 about界…

数据分析:微生物组差异丰度方法汇总

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2 介绍 微生物数据具有一下的特点,这使得在做差异分析的时候需要考虑到更多的问题&…

示例:WPF中应用MarkupExtention自定义IValueConverter

一、目的:应用MarkupExtention定义IValueConverter,使得应用起来更简单和高效 二、实现 public abstract class MarkupValueConverterBase : MarkupExtension, IValueConverter{public abstract object Convert(object value, Type targetType, object …

白酒:茅台镇白酒的配餐建议与味觉体验

茅台镇白酒,以其与众不同的酿造工艺和卓着的品质,成为了中国白酒的代表之一。而云仓酒庄豪迈白酒,作为茅台镇的品牌,其配餐建议与味觉体验备受关注。 在品鉴云仓酒庄豪迈白酒时,配餐的选择对于整体味觉体验至关重要。…

17.零代码八爪鱼采集器数据采集与数据导出——如何导出不同格式数据和数据推送到数据库

首先,多数情况下免费版本的功能,已经可以满足绝大多数采集需求,想了解八爪鱼采集器版本区别的详情,请访问这篇帖子: 3.无代码爬虫八爪鱼采集器工具介绍——个人版本、团队版本的适用性_八爪鱼采集器 有单机版本吗-CSDN…

基于Django的博客系统之增加手机验证码登录(九)

需求文档 概述 实现基于Redis和第三方短信服务商的短信验证码登录功能。用户可以通过手机号码获取验证码,并使用验证码进行登录。 需求细节 用户请求验证码 用户在登录页面输入手机号码并请求获取验证码。系统生成验证码并将其存储在Redis中,同时通过…

二叉树的基础讲解

二叉树在遍历,查找,增删的效率上面都很高,是数据结构中很重要的,下面我们来基础的认识一下。(高级的本人还没学,下面的代码用伪代码或C语言写的)我会从树,树的一些专有名词,树的遍历&#xff0c…