linux nasm汇编中调用printf不报错,但调用scanf报错。抛出了分段错误(核心转储)

当我写了如下汇编时

; nasm -f elf64 -g -F dwarf charsin.asm
; gcc charsin.o -no-pie -o charsin
; ld -o eatclib eatclib.o
; gdb eatclib[SECTION .data]SPrompt db 'Enter string data, followed by Enter: ',0IPrompt db 'Enter an integer value, followed by Enter: ',10,0IFormat db "%d",0SShow db 'The string you entered was: %s',0IShow db 'The Integer value you entered was: %5d',10,0[SECTION .bss]IntVal resd 1InString resb 128 [SECTION .text]extern stdinextern fgetsextern printfextern scanfglobal mainmain:push rbpmov rbp,rsppush rbxpush rsipush rdi;push SPromptmov rdi,SPrompt ; 传递参数mov rax,0call printf;add rsp,8; rdi,rsi,rdx,rcx分别保存第1,2,3,4个参数;push qword [stdin];push 72;push InStringmov rdi,InStringmov rsi,72mov rdx,[stdin]mov rax,0call fgets;add rsp,24;push InString;push SShowmov rdi,SShowmov rsi,InString;在汇编代码中,若是调用变长参数的函数,需要使用al这个寄存器记录使用到的向量寄存器数量。;这段代码中eax中存放的不是系统调用号,存放的是向量寄存器使用到的数量0,因为printf使用的是变长参数。mov rax,0call printf;add rsp,16mov rax,0push IPromptmov rdi,IPrompt ; 传递参数call printfadd rsp,8;push IntVal;push IFormatmov rdi,IFormat mov rsi,IntVal ; 保留数字的内存地址xor rax,raxcall scanf;add rsp,16;mov rax, 0  ;sys_read 系统调用号;mov rdi, 0  ; 文件描述符 标准输入;mov rsi,IntVal ; 保留数字的内存地址;mov rdx, 4;syscallxor rsi,rsimov rax,0mov rdi,IShow ; 传递格式参数mov esi,[IntVal]call printf;add rsp,16pop rdipop rsipop rbxmov rsp,rbppop rbpret

编译后,系统会如下段错误(Segmentation fault (core dumped)).
在这里插入图片描述

在函数的开始/结束处使用 sub rsp, 8/add rsp, 8 将堆栈重新对齐到 16函数执行调用之前的字节。

; nasm -f elf64 -g -F dwarf charsin.asm
; gcc charsin.o -no-pie -o charsin
; ld -o eatclib eatclib.o
; gdb eatclib[SECTION .data]SPrompt db 'Enter string data, followed by Enter: ',0IPrompt db 'Enter an integer value, followed by Enter: ',10,0IFormat db "%d",0SShow db 'The string you entered was: %s',0IShow db 'The Integer value you entered was: %5d',10,0[SECTION .bss]IntVal resd 1InString resb 128 [SECTION .text]extern stdinextern fgetsextern printfextern scanfglobal mainmain:push rbpmov rbp,rsppush rbxpush rsipush rdi;在函数的开始/结束处使用 sub rsp, 8/add rsp, 8 将堆栈重新对齐到 16函数执行调用之前的字节。sub rsp, 8;push SPromptmov rdi,SPrompt ; 传递参数mov rax,0call printf;add rsp,8; rdi,rsi,rdx,rcx分别保存第1,2,3,4个参数;push qword [stdin];push 72;push InStringmov rdi,InStringmov rsi,72mov rdx,[stdin]mov rax,0call fgets;add rsp,24;push InString;push SShowmov rdi,SShowmov rsi,InString;在汇编代码中,若是调用变长参数的函数,需要使用al这个寄存器记录使用到的向量寄存器数量。;这段代码中eax中存放的不是系统调用号,存放的是向量寄存器使用到的数量0,因为printf使用的是变长参数。mov rax,0call printf;add rsp,16mov rax,0push IPromptmov rdi,IPrompt ; 传递参数call printfadd rsp,8;push IntVal;push IFormatmov rdi,IFormat mov rsi,IntVal ; 保留数字的内存地址xor rax,raxcall scanf;add rsp,16;mov rax, 0  ;sys_read 系统调用号;mov rdi, 0  ; 文件描述符 标准输入;mov rsi,IntVal ; 保留数字的内存地址;mov rdx, 4;syscallxor rsi,rsimov rax,0mov rdi,IShow ; 传递格式参数mov esi,[IntVal]call printf;add rsp,16;在函数的开始/结束处使用 sub rsp, 8/add rsp, 8 将堆栈重新对齐到 16函数执行调用之前的字节。add rsp, 8pop rdipop rsipop rbxmov rsp,rbppop rbpret

编译后,程序运行正常。
在这里插入图片描述

参考段错误
StackOverflow

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

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

相关文章

Python进阶教学一

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、函数1.高阶函数2.返回函数3.匿名函数4.装饰器 二、实例1.类和实例2.限制访问3. 继承和多态4.实例属性和类属性 一、函数 1.高阶函数 1.1 map1.2 reduce1.3 fi…

Dsco Dropship EDI需求分析

供应商要想从Dsco处通过EDI获取订单,需要部署自己的EDI系统,与Dsco的EDI供应商CommerceHub 建立连接,分为两个方向: 1.从CommerceHub 的 Dsco 平台获取 EDI 850 采购订单 2.向Dsco发送库存(846)、订单状态…

MySQL的内外连接

1.内连接 内连接实际上就是利用 WHERE 子句(连接条件)对两张表形成的笛卡尔积(内连接)进行筛选,我们之前学习的查询基本都是内连接,也是在实际生产中被使用得最多的连接查询。 另外内连接还可以使用下面的…

Java Swing游戏开发学习7

内容来自RyiSnow视频讲解 这一节实现的是背景音乐和音效的播放。 在这里,背景音乐和音效所用的音频文件均为wav格式文件。Java SDK默认支持的格式有限,默认不支持mp3格式音乐。 背景音乐、拾取钥匙、拾取靴子、开门分别有对应的音频文件。 作者的实现…

2024-02学习笔记

1.当我们向Set集合中添加一个已经存在的元素时 当我们向Set集合中添加一个已经存在的元素时,Set集合会如何处理呢?实际上,Set集合不会将重复的元素添加到集合中。当我们向Set集合中添加一个元素时,Set集合会首先判断该元素是否已…

Ubuntu-22.04安装MegaCLI并查看MegaRAID的配置

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、MegaRAID二、安装MegaCLI1.Ubuntu-18.042.Ubuntu-22.043.Ubuntu-20.044.CentOS-75.其它发行版 三、使用MegaCLI1.查看所有适配器信息2.查看所有物理磁盘信息…

华为配置WLAN高密业务示例

配置WLAN高密业务示例 组网图形 图1 配置高密WLAN环境网络部署组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 体育场由于需要接入用户数量很大,AP间部署距离较小,因此AP间的干扰较大,可能导致用户上网网…

新王炸:文生视频Sora模型发布,能否引爆AI芯片热潮

前言 前方高能预警,Sora来袭! 浅析Sora的技术亮点 语言模型中构建关键词联系 视频素材分解为时空碎片 扩散模型DiT Not for play, But change world! OpenAI的宏大目标 未来已来,只是尚未流行 Sora的成本与OpenAI的7万亿美金豪赌 算…

【探索AI】人人都在讲AIGC,什么是AIGC?

AIGC 概述示例展示我们日常用到的一些工具/应用核心技术介绍核心技术的算法解析案例及部分代码实现1. 艺术作品2. 设计项目3. 影视特效4. 广告创意总结 一张图先了解下: 概述 "人工智能生成创造(Artificial Intelligence Generated Content&#x…

从CPU缓存结构到原子操作

一、CPU缓存结构 1.1 CPU的多级缓存 因为CPU的计算速度非常快,但内存的访问速度相对较慢。因此,如果CPU每次都要从内存读取数据,会造成大量的等待时间,降低整体性能。 通过引入多级缓存,可以在CPU和内存之间建立数据…

vue3中实现elementPlus表格选中行的上移下移

先看效果&#xff1a; 实现步骤&#xff1a; 1、给el-table添加current-change事件、高亮属性及ref属性 2、给上移下移按钮添加事件 // 定义当前选中的行参数 const currentRow ref<any>(null); // 定义表格的ref const singleTableRef ref(); // 行选中事件 const ha…

正信晟锦:借了钱的人一直不接电话不回信息咋办

在金钱往来中&#xff0c;遇到借出的钱款无法按时回收&#xff0c;且借款人如同人间蒸发一般不接电话、不回信息&#xff0c;确实让人焦虑。面对这种情形&#xff0c;我们需采取明智而有效的措施&#xff0c;以保护自身的权益。 首要策略是保持冷静&#xff0c;不要让情绪主导行…

四、《任务列表案例》后端程序实现和测试

本章概要 准备工作功能实现前后联调 4.1 准备工作 数据库脚本 CREATE TABLE schedule (id INT NOT NULL AUTO_INCREMENT,title VARCHAR(255) NOT NULL,completed BOOLEAN NOT NULL,PRIMARY KEY (id) );INSERT INTO schedule (title, completed) VALUES(学习java, true),(学…

【前端素材】推荐优质在线高端蜂蜜商城电商网页Beejar平台模板(附源码)

一、需求分析 1、系统定义 在线高端蜂蜜商城是指一个专门销售高品质、高端蜂蜜产品的电子商务平台。这种商城致力于向消费者提供各种经过精心挑选、具有高营养价值和健康功效的蜂蜜产品。 2、功能需求 在线高端蜂蜜商城是指一个专门销售高品质、高端蜂蜜产品的电子商务平台…

Go字符串实战操作大全!

目录 1. 引言文章结构概览 2. Go字符串基础字符串的定义与特性什么是字符串&#xff1f;Go字符串的不可变性原则 字符串的数据结构Go字符串的内部表达byte和rune的简介 3. 字符串操作与应用3.1 操作与应用字符串连接字符串切片字符串查找字符串比较字符串的替换字符串的大小写转…

vos3000外呼系统警告消除怎么设置

你有没有发现vos3000登陆时老是提示告警&#xff0c;消除一会又出现&#xff0c;那么又什么办法能解决呢&#xff1f;要彻底消除 VOS3000 系统的警告&#xff0c;一般需要通过以下步骤来进行排查和解决&#xff1a; 确认警告信息&#xff1a;首先要明确警告的具体内容和出现的条…

旧的Spring Security OAuth已停止维护,全面拥抱最新解决方案Spring SAS

Spring Authorization Server 替换 Shiro 指引 背景 Spring 团队正式宣布 Spring Security OAuth 停止维护&#xff0c;该项目将不会再进行任何的迭代 目前 Spring 生态中的 OAuth2 授权服务器是 Spring Authorization Server 已经可以正式生产使用作为 SpringBoot 3.0 的最新…

c++异常机制(3) -- 异常类型和生命周期

目录 抛出的异常类型大致可以分为三种。 第一种 基本类型 1. 可以直接抛出常量 2. 也可以抛出定义好的变量 3. 如果我们使用const&#xff0c;会不会影响到异常的匹配。 第二种 字符串类型以及指针类型 1. 使用字符指针 注意: 2. 使用string类型 第三种 …

计算机专业大学生的简历,为何会出现在垃圾桶

为什么校招过后垃圾桶里全是简历&#xff0c;计算机专业的学生找工作有多难&#xff1f; 空哥这么跟你说吧&#xff0c;趁现在还来得及&#xff0c;这些事情你一定要听好了。 第一&#xff0c;计算机专业在学校学的东西是非常有限的&#xff0c;985211的还好&#xff0c;如果…

GPS历史轨迹优化算法的研究与实现

GPS历史轨迹优化算法的研究与实现 摘要 本研究提出了一种综合利用数据清洗、密度聚类、卡尔曼滤波和地图匹配的新算法,命名为“DSKF-Match”。该算法旨在处理GPS轨迹数据,通过清洗、聚类、平滑和匹配等步骤,提高数据的质量和准确性。首先,算法利用时间窗口法进行数据清洗…