幫助中心 | 我的帳號 | 關於我們

Linux x64彙編語言編程

  • 作者:(美)傑夫·鄧特曼|責編:王軍|譯者:賈玉彬//王文傑
  • 出版社:清華大學
  • ISBN:9787302686415
  • 出版日期:2025/06/01
  • 裝幀:平裝
  • 頁數:446
人民幣:RMB 158 元      售價:
放入購物車
加入收藏夾

內容大鋼
    本書介紹二進位、十六進位、計算、編程和x64架構的基礎知識,分析Linux軟體開發過程,講解NASM彙編器、x64指令集、內存定址、過程、宏及Linux的C庫函數介面,披露軟體設計、編碼、測試和調試的實用技巧。本書示例代碼豐富,文筆幽默,將深奧的知識講得簡單易懂,引導你循序漸進地學會彙編編程。
    本書是權威的Intel/AMD x64教程,是學習x64彙編語言的黃金標準,非常適合自學。

作者介紹
(美)傑夫·鄧特曼|責編:王軍|譯者:賈玉彬//王文傑
    傑夫·鄧特曼(Jeff Duntemann),是一位在科幻文學與技術領域皆有建樹的知名作家,發表技術文章逾百篇;現為技術出版顧問兼Copperwood Press獨立出版人。Jeff迄今已撰寫20本技術書籍。Jeff曾在Dr.Dobb's Journal雜誌撰寫「結構化編程」專欄達四年之久,並在其他雜誌上發表了數十篇技術文章。其作品以技術深度與敘事魅力的完美融合著稱。

目錄
第1章  一切都在計劃之中——真正理解電腦的工作原理
  1.1  完美的周六計劃
    1.1.1  步驟和測試
    1.1.2  決定總是具有二元性
    1.1.3  電腦像我們一樣思考
  1.2  如果這是真的
  1.3  將彙編語言編程比作方塊舞
  1.4  將彙編語言編程比作棋盤遊戲
    1.4.1  代碼和數據
    1.4.2  地址
    1.4.3  總結
第2章  外星人基地——理解二進位和十六進位
  2.1  新數學怪獸的回歸
    2.1.1  使用火星文計數
    2.1.2  剖析火星數字
    2.1.3  數基的本質
  2.2  八進位:鬼精靈如何偷走8和
  2.3  十六進位:解決數字短缺問題
  2.4  從十六進位到十進位以及從十進位到十六進位
    2.4.1  從十六進位到十進位
    2.4.2  從十進位到十六進位
  2.5  練習!練習!練習!
  2.6  十六進位算術
    2.6.1  列和進位
    2.6.2  減法和借位
    2.6.3  跨多列借位
    2.6.4  重點是什麼?
  2.7  二進位
    2.7.1  二進位值
    2.7.2  為什麼是二進位
  2.8  十六進位作為二進位的簡寫
  2.9  準備計算
第3章  揭開面紗——了解電腦的真實面貌
  3.1  RAX寄存器,我們幾乎不了解
  3.2  開關、晶體管和內存
    3.2.1  如果敵方陸路來襲,則點亮一盞燈
    3.2.2  晶體管開關
    3.2.3  令人難以置信的比特縮小現象
    3.2.4  隨機訪問
    3.2.5  內存訪問時間
    3.2.6  位元組、字、雙字和四字
    3.2.7  排成一排的精美晶元
  3.3  CPU和裝配線
    3.3.1  與內存對話
    3.3.2  搭乘數據匯流排
    3.3.3  寄存器
    3.3.4  裝配線
  3.4  遵循計劃的盒子
    3.4.1  獲取並執行
    3.4.2  CPU的內部結構

    3.4.3  改變路線
  3.5  什麼與如何:架構和微架構
    3.5.1  不斷演變的架構
    3.5.2  地下室的秘密機器
  3.6  工廠經理
    3.6.1  操作系統:轉角辦公室
    3.6.2  BIOS:軟體不「軟」
    3.6.3  多任務魔法
    3.6.4  提升至內核
    3.6.5  內核爆炸
    3.6.6  計劃
第4章  定址、定址、定址——寄存器、內存定址及了解數據的位置
  4.1  內存模型的樂趣
    4.1.11  6位能「買到」64KB
    4.1.2  兆位元組(MB)的本質
    4.1.3  向後兼容和虛擬86模式
    4.1.41  6位的視野限制
  4.2  分段的本質
    4.2.1  一條地平線,而不是一個具體位置
    4.2.2  使用16位寄存器生成20位地址
  4.3  分段寄存器
    4.3.1  分段寄存器和x
    4.3.2  通用寄存器
    4.3.3  寄存器的高位和低位
    4.3.4  指令指針
    4.3.5  標誌寄存器
    4.3.6  數學協處理器及其寄存器
  4.4  四種主要的彙編編程模型
    4.4.1  實模式平面模型
    4.4.2  實模式分段模型
    4.4.33  2位保護模式平面模型
    4.4.46  4位長模式編程模型
第5章  彙編的正確方式——彙編語言程序的開發過程
  5.1  編程的96種方法
  5.2  文件及其內容
    5.2.1  二進位文件與文本文件
    5.2.2  使用GHex十六進位編輯器查看二進位文件內部
    5.2.3  解釋原始數據
    5.2.4  位元組順序
  5.3  輸入文本,輸出代碼
    5.3.1  彙編語言
    5.3.2  註釋
    5.3.3  當心「只寫源代碼」!
    5.3.4  目標代碼、鏈接器和庫
    5.3.5  可重定位性
  5.4  彙編語言的開發過程
    5.4.1  工作目錄的規則
    5.4.2  編輯源代碼文件
    5.4.3  彙編源代碼文件
    5.4.4  彙編器錯誤

    5.4.5  回到編輯器
    5.4.6  編譯器警告
  5.5  鏈接目標代碼文件
    5.5.1  鏈接器錯誤
    5.5.2  測試EXE文件
    5.5.3  錯誤與缺陷
    5.5.4  調試器和調試
  5.6  走進彙編語言的世界
    5.6.1  安裝軟體
    5.6.2  步驟1:在編輯器中編輯程序
    5.6.3  步驟2:使用NASM彙編程序
    5.6.4  步驟3:使用ld鏈接程序
    5.6.5  步驟4:測試可執行文件
    5.6.6  步驟5:在調試器中觀察它的運行
第6章  一個可使用工具的立足之地——Linux和塑造你的工作方式的工具
  6.1  集成開發環境(IDE)
  6.2  SASM簡介
    6.2.1  配置SASM
    6.2.2  SASM的字體
    6.2.3  使用編譯器鏈接
    6.2.4  SASM速覽
    6.2.5  SASM的編輯器
    6.2.6  SASM對你的代碼有何要求
  6.3  Linux和終端
    6.3.1  Linux控制台
    6.3.2  Konsole中的字元編碼
    6.3.3  三個標準UNIX文件
    6.3.4  I/O重定向
    6.3.5  簡單文本過濾器
    6.3.6  使用SASM內部的標準輸入和標準輸出
    6.3.7  使用轉義序列進行終端控制
    6.3.8  為什麼不使用GUI應用程序
  6.4  使用LinuxMake
    6.4.1  依賴
    6.4.2  當文件是最新的
    6.4.3  依賴鏈
    6.4.4  調用Make
    6.4.5  為Make創建自定義按鍵綁定
    6.4.6  使用touch強制構建
  6.5  使用SASM進行調試
第7章  遵循你的指令——近距離觀察機器指令
  7.1  構建自己的沙箱
  7.2  指令及其操作數
  7.3  源操作數和目標操作數
    7.3.1  即時數據
    7.3.2  寄存器數據
    7.3.3  內存數據和有效地址
    7.3.4  混淆數據及其地址
    7.3.5  內存數據的大小
    7.3.6  糟糕的舊時光

  7.4  團結在「標誌」周圍
    7.4.1  標誌禮儀
    7.4.2  在SASM中觀察標誌
    7.4.3  使用INC和DEC進行加1和減1操作
    7.4.4  標誌如何改變程序的執行
    7.4.5  如何檢查SASM中的變數
  7.5  有符號值和無符號值
    7.5.1  二進位補碼和NEG
    7.5.2  符號擴展和MOVSX
  7.6  隱式操作數和MUL
    7.6.1  MUL和進位標誌
    7.6.2  使用DIV進行無符號除法
    7.6.3  MUL和DIV速度很慢
  7.7  閱讀和使用彙編語言參考
    7.7.1  複雜記憶的備忘錄
    7.7.2  初學者的彙編語言參考
    7.7.3  標誌
  7.8  NEG取反(二進位補碼,即乘以-1)
    7.8.1  受影響的標誌
    7.8.2  有效形式
    7.8.3  示例
    7.8.4  備註
    7.8.5  有效形式
    7.8.6  操作數符號
    7.8.7  示例
    7.8.8  備註
    7.8.9  這裡沒有提到的內容……
第8章  我們崇高的目標——創建有效的程序
  8.1  彙編語言程序的骨架
    8.1.1  初始註釋塊
    8.1.2  .data部分
    8.1.3  .bss部分
    8.1.4  .text部分
    8.1.5  標籤
    8.1.6  初始化數據的變數
    8.1.7  字元串變數
    8.1.8  使用EQU和$推導字元串長度
  8.2  通過棧後進先出
    8.2.1  每小時500個盤子
    8.2.2  倒置堆疊
    8.2.3  壓入指令
    8.2.4  POP指令登場
    8.2.5  PUSHA和POPA已停用
    8.2.6  壓入和彈出的詳細信息
    8.2.7  短期存儲
  8.3  通過SYSCALL使用Linux內核服務
    8.3.1  通過SYSCALL指令使用x64內核服務
    8.3.2  ABI與API的區別
    8.3.3  ABI的寄存器參數方案
    8.3.4  通過SYSCALL退出程序

    8.3.5  被SYSCALL破壞的寄存器
  8.4  設計一個不平凡的程序
    8.4.1  定義問題
    8.4.2  從偽代碼開始
    8.4.3  持續改進
    8.4.4  那些不可避免的驚訝時刻
    8.4.5  掃描緩衝區
    8.4.6  差一錯誤
    8.4.7  從偽代碼到彙編代碼
    8.4.8  SASM輸出窗口的陷阱
    8.4.9  進一步學習
第9章  位、標誌、分支和表——逐步駛入彙編編程的主航道
  9.1  位就是位(位元組也是位)
    9.1.1  位編號
    9.1.2  最合乎邏輯的做法
    9.1.3  AND指令
    9.1.4  掩碼位
    9.1.5  OR指令
    9.1.6  XOR(異或)指令
    9.1.7  NOT指令
    9.1.8  分段寄存器沒有邏輯
  9.2  移位
    9.2.1  通過什麼移位
    9.2.2  移位的工作原理
    9.2.3  將位放入進位標誌
    9.2.4  旋轉指令
    9.2.5  通過進位標誌旋轉位
    9.2.6  將已知值設置到進位標誌中
  9.3  位操作實戰
    9.3.1  將一位元組拆分成兩個「半位元組」
    9.3.2  將高半位元組移入低半位元組
    9.3.3  使用查找表
    9.3.4  通過移位和加法進行乘法
  9.4  標誌、測試和分支
    9.4.1  無條件跳轉
    9.4.2  有條件跳轉
    9.4.3  在缺少條件的情況下跳轉
    9.4.4  標誌
    9.4.5  使用CMP進行比較
    9.4.6  跳轉指令的「叢林」
    9.4.7  「大於」與「高於」
    9.4.8  使用TEST查找1位
    9.4.9  使用BT尋找0位
  9.5  x64長模式內存定址詳解
    9.5.1  有效地址計算
    9.5.2  位移
    9.5.3  x64位移大小問題
    9.5.4  基址定址
    9.5.5  基址+位移定址
    9.5.6  基址+索引定址

    9.5.7  索引×比例+位移定址
    9.5.8  其他定址方案
    9.5.9  LEA:絕密數學機器
  9.6  字元表轉換
    9.6.1  轉換表
    9.6.2  使用MOV或XLAT進行轉換
  9.7  用表代替計算
第10章  分而治之——使用過程和宏來應對程序複雜性
  10.1  層層嵌套
  10.2  調用和返回
    10.2.1  調用中的調用
    10.2.2  意外遞歸的危險
    10.2.3  需要警惕的標誌相關錯誤
    10.2.4  過程及其所需的數據
    10.2.5  保存調用者的寄存器
    10.2.6  在Linux系統調用中保存寄存器
    10.2.7  PUSHAD和POPAD已廢棄
    10.2.8  本地數據
    10.2.9  在過程定義中放置常量數據
    10.2.10  更多表技巧
  10.3  本地標籤和跳轉的長度
    10.3.1  強制本地標籤訪問
    10.3.2  短、近和遠跳轉
  10.4  構建外部過程庫
    10.4.1  當工具達到極限時
    10.4.2  在SASM中使用包含文件
    10.4.3  SASM包含文件的存儲位置
    10.4.4  創建包含文件庫的最佳方法
    10.4.5  獨立彙編和模塊
    10.4.6  全局和外部聲明
    10.4.7  全局變數和外部變數的機制
    10.4.8  將庫鏈接到程序中
    10.4.9  太多過程和庫會造成危險
  10.5  製作過程的藝術
    10.5.1  可維護性和重用性
    10.5.2  決定什麼應該是一個過程
    10.5.3  使用註釋標題
  10.6  Linux控制台中的簡單游標控制
  10.7  創建和使用宏
    10.7.1  宏定義的機制
    10.7.2  定義帶參數的宏
    10.7.3  調用宏的機制
    10.7.4  宏內的本地標籤
    10.7.5  宏庫作為包含文件
    10.7.6  宏與過程:優點和缺點
第11章  字元串及其他——那些令人驚嘆的字元串指令
  11.1  彙編語言字元串的概念
    11.1.1  徹底改變你的「字元串感」
    11.1.2  源字元串和目標字元串
    11.1.3  文本顯示虛擬屏幕

  11.2  REPSTOSB:軟體機關槍
    11.2.1  機關槍式操作虛擬顯示
    11.2.2  執行STOSB指令
    11.2.3  STOSB和方向標誌DF
    11.2.4  定義顯示緩衝區中的行
    11.2.5  將緩衝區發送到Linux控制台
  11.3  半自動武器:沒有REP的STOSB
    11.3.1  誰減少了RCX?
    11.3.2  LOOP指令
    11.3.3  在屏幕上顯示標尺
    11.3.4  MUL不是IMUL
    11.3.5  Ruler的教訓
    11.3.6  STOS的四種大小
    11.3.7  再見,BCD算術
  11.4  MOVSB:快速塊複製
    11.4.1  DF和重疊阻擋移動
    11.4.2  單步REP字元串指令
  11.5  將數據存儲到不連續的字元串中
    11.5.1  顯示一個ASCII表
    11.5.2  嵌套指令循環
    11.5.3  當RCX變為0時跳轉
    11.5.4  關閉內循環
    11.5.5  關閉外循環
    11.5.6  回顧showchar
  11.6  命令行參數、字元串搜索和Linux棧
    11.6.1  顯示SASM的命令行參數
    11.6.2  使用SCASB進行字元串搜索
    11.6.3  REPNE與REPE
    11.6.4  無法將命令行參數傳遞給SASM中的程序
  11.7  棧及其結構和使用方法
    11.7.1  直接訪問棧
    11.7.2  程序序言和結語
    11.7.3  棧上的定址數據
    11.7.4  不要彈出
第12章  轉向C——調用C語言編寫的外部函數
  12.1  GNU
    12.1.1  瑞士軍刀編譯器
    12.1.2  以GNU方式構建代碼
    12.1.3  SASM使用GCC
    12.1.4  如何在彙編工作中使用gcc
    12.1.5  為什麼不使用gas
  12.2  鏈接標準C庫
    12.2.1  C調用約定
    12.2.2  調用者、被調用者和破壞者
    12.2.3  設置棧幀
    12.2.4  在結語中銷毀棧幀
    12.2.5  棧對齊
    12.2.6  通過puts()輸出字元
  12.3  使用printf()格式化文本輸出
    12.3.1  將參數傳遞給printf()

    12.3.2  printf()需要在RAX中加上前置
    12.3.3  你需要使用-no-pie選項
  12.4  使用fgets()和scanf()輸入數據
  12.5  成為Linux時間領主
    12.5.1  C庫的時間機器
    12.5.2  從系統時鐘獲取time_t值
    12.5.3  將time_t值轉換為格式化字元串
    12.5.4  生成單獨的本地時間值
    12.5.5  使用MOVSD複製glibc的tm結構
  12.6  理解AT&T指令助記符
    12.6.1  AT&T助記符約定
    12.6.2  AT&T內存引用語法
  12.7  生成隨機數
    12.7.1  使用srand()為生成器設定種子
    12.7.2  生成偽隨機數
    12.7.3  相比之下有些比特更隨機
    12.7.4  調用寄存器中的地址
    12.7.5  使用puts()將一個裸換行符發送到控制台
    12.7.6  如何向libc函數傳遞六個以上的參數
  12.8  C語言如何處理命令行參數
  12.9  簡單文件I/O
    12.9.1  使用sscanf()將字元串轉換為數字
    12.9.2  創建和打開文件
    12.9.3  使用fgets()從文件讀取文本
    12.9.4  使用fprintf()將文本寫入文件
    12.9.5  將過程收集到庫中的注意事項
  12.10  永遠學習,永遠不要停下來
    12.10.1  何去何從
    12.10.2  走出原點
(以下內容可掃描封底二維碼下載)
附錄A  Insight調試器的回歸
附錄B  部分x64指令參考
附錄C  字符集圖表

  • 商品搜索:
  • | 高級搜索
首頁新手上路客服中心關於我們聯絡我們Top↑
Copyrightc 1999~2008 美商天龍國際圖書股份有限公司 臺灣分公司. All rights reserved.
營業地址:臺北市中正區重慶南路一段103號1F 105號1F-2F
讀者服務部電話:02-2381-2033 02-2381-1863 時間:週一-週五 10:00-17:00
 服務信箱:bookuu@69book.com 客戶、意見信箱:cs@69book.com
ICP證:浙B2-20060032