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.pswp.cn/news/711328.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711328.shtml
英文地址,請注明出處:http://en.pswp.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軌跡數據,通過清洗、聚類、平滑和匹配等步驟,提高數據的質量和準確性。首先,算法利用時間窗口法進行數據清洗…