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

news2024/11/15 14:02:09

当我写了如下汇编时

; 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: ',0
  IPrompt db 'Enter an integer value, followed by Enter: ',10,0
  IFormat db "%d",0
  SShow db 'The string you entered was: %s',0
  IShow db 'The Integer value you entered was: %5d',10,0


[SECTION .bss]
 IntVal resd 1
 InString resb 128 


[SECTION .text]

 extern stdin
 extern fgets
 extern printf
 extern scanf
 global main

 main:
   
   push rbp
   mov rbp,rsp
   push rbx
   push rsi
   push rdi
   
   
   ;push SPrompt
   mov rdi,SPrompt ; 传递参数
   mov rax,0
   call printf
   ;add rsp,8
 
   ; rdi,rsi,rdx,rcx分别保存第1,2,3,4个参数
   ;push qword [stdin]
   ;push 72
   ;push InString
   mov rdi,InString
   mov rsi,72
   mov rdx,[stdin]
   mov rax,0
   call fgets
   ;add rsp,24
   
   ;push InString
   ;push SShow
   mov rdi,SShow
   mov rsi,InString
   ;在汇编代码中,若是调用变长参数的函数,需要使用al这个寄存器记录使用到的向量寄存器数量。
   ;这段代码中eax中存放的不是系统调用号,存放的是向量寄存器使用到的数量0,因为printf使用的是变长参数。
   mov rax,0
   call printf
   ;add rsp,16
   
   mov rax,0
   push IPrompt
   mov rdi,IPrompt ; 传递参数
   call printf
   add rsp,8
   
   ;push IntVal
   ;push IFormat
   mov rdi,IFormat 
   mov rsi,IntVal ; 保留数字的内存地址
   xor rax,rax
   call scanf
   ;add rsp,16
   
   ;mov rax, 0  ;sys_read 系统调用号
   ;mov rdi, 0  ; 文件描述符 标准输入
   ;mov rsi,IntVal ; 保留数字的内存地址
   ;mov rdx, 4
   ;syscall
   
   xor rsi,rsi
   mov rax,0
   mov rdi,IShow ; 传递格式参数
   mov esi,[IntVal]
   call printf
   ;add rsp,16
  
  pop rdi
  pop rsi
  pop rbx
  mov rsp,rbp
  pop rbp
  
  
  ret

编译后,系统会如下段错误(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: ',0
  IPrompt db 'Enter an integer value, followed by Enter: ',10,0
  IFormat db "%d",0
  SShow db 'The string you entered was: %s',0
  IShow db 'The Integer value you entered was: %5d',10,0


[SECTION .bss]
 IntVal resd 1
 InString resb 128 


[SECTION .text]

 extern stdin
 extern fgets
 extern printf
 extern scanf
 global main

 main:
   
   push rbp
   mov rbp,rsp
   push rbx
   push rsi
   push rdi
   
   ;在函数的开始/结束处使用 sub rsp, 8/add rsp, 8 将堆栈重新对齐到 16函数执行调用之前的字节。
   sub rsp, 8
   
   ;push SPrompt
   mov rdi,SPrompt ; 传递参数
   mov rax,0
   call printf
   ;add rsp,8
 
   ; rdi,rsi,rdx,rcx分别保存第1,2,3,4个参数
   ;push qword [stdin]
   ;push 72
   ;push InString
   mov rdi,InString
   mov rsi,72
   mov rdx,[stdin]
   mov rax,0
   call fgets
   ;add rsp,24
   
   ;push InString
   ;push SShow
   mov rdi,SShow
   mov rsi,InString
   ;在汇编代码中,若是调用变长参数的函数,需要使用al这个寄存器记录使用到的向量寄存器数量。
   ;这段代码中eax中存放的不是系统调用号,存放的是向量寄存器使用到的数量0,因为printf使用的是变长参数。
   mov rax,0
   call printf
   ;add rsp,16
   
   mov rax,0
   push IPrompt
   mov rdi,IPrompt ; 传递参数
   call printf
   add rsp,8
   
   ;push IntVal
   ;push IFormat
   mov rdi,IFormat 
   mov rsi,IntVal ; 保留数字的内存地址
   xor rax,rax
   call scanf
   ;add rsp,16
   
   ;mov rax, 0  ;sys_read 系统调用号
   ;mov rdi, 0  ; 文件描述符 标准输入
   ;mov rsi,IntVal ; 保留数字的内存地址
   ;mov rdx, 4
   ;syscall
   
   xor rsi,rsi
   mov rax,0
   mov rdi,IShow ; 传递格式参数
   mov esi,[IntVal]
   call printf
   ;add rsp,16
  
  ;在函数的开始/结束处使用 sub rsp, 8/add rsp, 8 将堆栈重新对齐到 16函数执行调用之前的字节。
  add rsp, 8
  
  pop rdi
  pop rsi
  pop rbx
  mov rsp,rbp
  pop rbp
  
  
  ret

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

参考段错误
StackOverflow

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

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

相关文章

持安科技亮相张江高科895创业营,总评分第三名荣获「最具创新性企业」!

近日,张江高科895创业营(第十三季)信息安全专场Demo day&结营仪式在上海集成电路设计产业园圆满落幕。本季创业营通过多种渠道在海内外甄选优秀创业项目,一共择优录取了29家入营,最终甄选出9家代表参加Demo day路演…

three 模型对象、材质

三维向量Vector3与模型位置 点模型Points、线模型Line、网格网格模型Mesh等模型对象的父类都是Object3D ,如果想对这些模型进行旋转、缩放、平移等操作,如何实现,可以查询Threejs文档Object3D 对相关属性和方法的介绍。 三维向量Vector3 三…

有道QAnything背后的故事---关于RAG的一点经验分享

近日,我们开源了有道自研的RAG(Retrieval Augmented Generation) 引擎QAnything。该引擎允许用户上传PDF、图片、Word、Excel、PowerPoint等多种格式的文档,并实现类似于ChatGPT的互动问答功能,其中每个答案都能精确追溯到相应的文…

降压芯片的工作原理是什么?都有哪些推荐?

降压恒压芯片工作原理: 通过将输入电压降低到合适的电压级别,以供应给LED灯。它采用PWM(脉冲宽度调制)技术来调节开关管的开关时间,从而实现稳定的输出电压,保持LED灯的亮度稳定。降压恒压芯片涉及降压转换…

SpringBoot【问题 05】PostgreSQL数据库启用SSL后使用默认配置进行数据库连接(Navicat工具与Java程序)

官网SSL说明:https://www.postgresql.org/docs/9.1/libpq-ssl.html 1.配置 1.1 文件 使用SSL需要的4个文件,名称要一致: 客户端密钥:postgresql.keyJava客户端密钥:postgresql.pk8客户端证书:postgresq…

idea 创建打包 android App

1、使用 idea 创建 android 工程 2、 配置构建 sdk 3、配置 gradle a、进入 gradle 官网,选择 install (默认是最新版本) b、选择包管理安装,手动安装选择下面一个即可 c、安装 sdk 并通过 sdk 安装 gradle 安装 sdk&#xff1a…

软件测试面试:请说一下你工作中发现的最有价值的bug?

这个问题,基本95%的面试都会遇到。究竟面试官想要知道什么呢? 让我们回到这个面试场景来看看。 “说一下你印象最深的bug" 你的脑子里拼命的回想过去遇到的印象深刻或有价值的bug。 乍一眼看,这是一个简答到不起眼的问题。可是同学们…

“智农”-数字乡村可视化

“智农”打造数字乡村可视化,结合乡村区域实际情况,以规划完善乡村机制体系和更好服务乡村振兴为目标,坚持可持续、可复制、可扩展的建设原则,着力解决农村信息孤岛,提高农村种植技术,加快农村信息化和产业…

3,设备无关位图显示

建立了一个类Dib Dib.h #pragma once #include “afx.h” class CDib :public CObject { public: CDib(); ~CDib(); char* GetFileName(); BOOL IsValid(); DWORD GetSize(); UINT GetWidth(); UINT GetHeight(); UINT GetNumberOfColors(); RGBQUAD* GetRGB(); BYTE* GetDat…

three.js 向量叉乘cross

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs"></div><div></div></div></el-main></el-container>…

EasyRecovery2024免费无需付费版电脑数据恢复软件

一、功能概述 EasyRecovery数据恢复软件是一个功能全面的数据恢复工具&#xff0c;其主要功能包括&#xff1a; 文件恢复&#xff1a;能够恢复各种文件类型&#xff0c;如文档、图片、视频、音频等&#xff0c;满足用户多样化的数据恢复需求。分区恢复&#xff1a;当硬盘分区…

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

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

将所有字母转化为该字母后的第三个字母,即A->D,B->E

//编写加密程序&#xff0c;规则&#xff1a;将所有字母转化为该字母后的第三个字母&#xff0c;即A->D,B->E,C->F,…Y->B,Z->C //小写字母同上&#xff0c;其他字符不做转化。输入&#xff1a;I love 007 输出&#xff1a;L oryh 007 代码&#xff1a; #inc…

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(十二)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型&#xff0c;由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”&#xff08;そら sora&#xff09;&#xff0c;即天空之意&#xff0c;以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…

day05_用户管理minIO角色分配(页面制作,查询用户,添加用户,修改用户,删除用户,用户头像,查询所有角色,保存角色数据)

文章目录 1 用户管理1.1 页面制作1.2 查询用户1.2.1 需求说明1.2.2 后端接口需求分析SysUserSysUserDtoSysUserControllerSysUserServiceSysUserMapperSysUserMapper.xml 1.2.3 前端对接实现思路sysUser.jssysRole.vue 1.3 添加用户1.3.1 需求说明1.3.2 页面制作1.3.3 后端接口…

Kotlin:协程基础

点击查看&#xff1a;协程基础 中文文档 点击查看&#xff1a;协程基础 英文文档 第一个协程程序 import kotlinx.coroutines.*fun main(){GlobalScope.launch {delay(1000L)//delay 是一个特殊的 挂起函数 &#xff0c;它不会造成线程阻塞&#xff0c;但是会 挂起 协程&…

记一次dockerfile无法构建问题追溯

我有一个dockerfile如下&#xff1a; ENTRYPOINT ["/sbin/tini"&#xff0c;"-g", "--"] CMD /home/scrapy/start.sh 我原本的用意是先启动tini&#xff0c;再执行下面的cmd命令启动start.sh。 为啥要用tini&#xff1f; 因为我的这个docker…

springboot235基于SpringBoot的房屋交易平台的设计与实现

房屋交易平台设计与实现 摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互…

DDOS攻击处理方法

DDoS&#xff08;分布式拒绝服务&#xff09;攻击是一种网络攻击&#xff0c;攻击者通过发送大量的请求&#xff0c;超过目标服务器的处理能力&#xff0c;导致服务器服务不可用。本文将介绍如何处理DDoS攻击&#xff0c;并提供几种防范措施。 1. 认识DDoS攻击 DDoS攻击通常通过…

【Unity】使用Unity实现双屏显示

引言 在使用Unity的时候&#xff0c;有时候会需要使用双屏显示 简单来说就是需要在两个显示器中显示游戏画面 双屏显示注意点&#xff1a; ①双屏显示需要电脑有两个显示 ②双屏显示只能用于PC端 ③不仅仅可以双屏&#xff0c;Unity最大支持8屏显示 1.相机设置 ①我们打开Un…