1. 程式人生 > >暫時沒有想好呢。

暫時沒有想好呢。

參考: 清華大學《組合語言程式設計》課程, 主講教師:張悠慧

彙編程式設計師中的CPU包括:

指令暫存器,即PC, 它儲存了下一條指令的地址, 使用EIP(x86-32)或RIP(x86-64)訪問。

暫存器堆:各種暫存器;

條件碼: 用於儲存最近執行的指令的結果狀態資訊, 也用於條件跳轉指令的判斷;

以AT&T彙編格式(即linux系統下)程式碼的格式;

image

(在組合語言中沒有資料型別,一般採用彙編指令的字尾進行區分)

在組合語言中, 暫存器名字前加 %, 立即數前加 $,

定址方式與資料傳輸指令

定址方式:

間接定址: (R),  在暫存器R中指定記憶體的地址, 如: mov1 (%ecx),  %eax

基址+偏移量 定址:D(R), 在暫存器R中指定基址,常數D給出偏移量, 如:mov 8(%ebp), %edx

通用形式: D(Rb, Ri, S), 尋找記憶體地址為 Rb + S * Ri + D處的資料。

其中,D表示地址偏移常量; Rb表示基址暫存器,它為8個通用暫存器之一; Ri 表示索引暫存器(%esp與ebp通常不作為索引暫存器, %esp常作棧頂暫存器);S表示比例因子, 為1, 2, 4, 8;

資料傳輸指令

資料傳送指令(mov):

movl source, dest

將一個“雙字”從source 移到 dest. 允許的運算元的型別包括:立即數、暫存器和儲存器,如下圖所示( 兩個運算元不能同時是記憶體地址,因為x86中一條指令不能同時訪問再次記憶體)

image

mov 常用的指令格式:

image

地址計算指令(lea):

leal src, dest

功能:用於計算表示式src的地址放到暫存器dest中。 其中,src表示地址的計算表示式, dest表示目的暫存器(注意:dest 不能為記憶體地址,只能是在暫存器

補充: 由於lea 命令可以把一個合適的表示式只用一條指令表示出來,所以可以使用lea進行這一型別的整數計算,而不僅僅進行地址的計算。

雙運算元指令:

addl src, dest        dest = dest + src            #求和
subl src, dest        dest = dest - src            #減法
imull src, dest        dest 
= dest * src #乖法 sall src, dest dest = dest << src #邏輯左移 shll src, dest dest = dest << src #算術左移 sarl src, dest dest = dest >> src #邏輯右移 shrl src, dest dest = dest >> src #算術右移 xorl src, dest dest = dest ^ src #按位異或 andl src, dest dest = dest & src #按位與 orl src, dest dest = dest | src #按位或

單運算元指令:

image

x86-64下的通用暫存器

image

1. %eax, %edx, %ecx, %ebx, %esi, %edi, %dsp, %ebp 是 x86-32下的8個通用暫存器。 x

2. 86-64共有了16個通用暫存器。

3. %ebp/%rbp不再是專用暫存器。

4. %esp, 當前執行棧的棧頂地址,%ebp, 當前執行棧的“幀”地址。

5. 在x86-64下, 引數的通常使用暫存器進行傳遞。  具體為:當函式的引數少於7個時, 引數從左到右放入暫存器 rdi, rsi, rdx, rcx, r8, r9中。 當引數大於等於7個時, 後面的引數依次按從右向左順序放入到棧中。

控制流

條件碼

條件碼由算術指令隱含設定

CF進位標誌: 可以用於檢測無符號整數運算的溢位;

ZF:零標誌位,當運算結果為零時, ZF=1, 非零時為ZF=0;

SF符號位,當運算結果為負時,SF=1, 為正時SF= 0;

OF溢位標誌, 當補碼運算溢位時(即當兩個正整數相加小於零或兩個負數相加大於零時或正減負小於零或負減正大於零,就是溢位), OF=1。

比較指令

cmpl src2, src1
cmpq src2, src1

注意一個順序,如果我們比較a 與 b 的大小,則應該寫為  cmpl b, a;     這樣才能寫後面的setx 及jx相對應。

cmpl b, a         比較的目的是:根據   a-b的結果 去改變條件碼的;

cmpl 指令常常與 setx 指令以及 jx 指令一起使用。

測試指令

testl src2, src1
testq src2, src1

測試的目的是: 根據 src1 & src2 的結果去修改條件碼。

setx指令

讀取當前的條件碼(或者某些條件碼的組合),並存入目的“位元組”暫存器。(這裡強調位元組,意思就是結果為8個bit)

也可以說,如果滿足描述的條件,即setx就會置1, 否則置0。

image

說明:1. 上圖中的 description 是什麼意思呢??它表示的意思就是 condition 中公式表達出來的意思,可以根據 condition裡的公式推出來description的。

當我們比較 x 與 y 的大小時,用偽指令 cmpl y, x 表示以後, 我們就可以使用指令setx 來檢視比較的結果,如 指令 setg 返回 x>y 的結果.

例子: x86-32下的C語言:

image

x86-64下的C語言:

image

image

jx 指令

依賴當前的條件碼,選擇下一條需要執行的語句。 如果滿足條件,就跳轉,否則就順序執行。

image

例子:

 image

備註: 跳轉指令的效率不高(因為流水線設計),經常使用條件傳送指令 cmovX 取代。  cmov 是從 i686開始的,不相容i386. 當使用gcc 編譯時,可以通過-march=i686選擇編譯帶cmovX的彙編程式碼。比如下面的例子:

image

g

相關推薦

暫時沒有

參考: 清華大學《組合語言程式設計》課程, 主講教師:張悠慧 彙編程式設計師中的CPU包括: 指令暫存器,即PC, 它儲存了下一條指令的地址, 使用EIP(x86-32)或RIP(x86-64)訪問。 暫存器堆:各種暫存器; 條件碼: 用於儲存最近執行的指令的結果狀態資訊, 也用於條件跳轉指令的判斷;

怎麽定位微信恢復自己的定位系統沒有的辦法定位其他微信?

文件夾 字母 data 完成後 退出 命名 系統文件 自己 root 微信是騰訊旗下的一款社交軟件,和QQ有點類似,微信的記錄大都數都是暫時的保存在手機內存卡裏面的,會自動根據保存的數據大小不定時的情況一些記錄,如果微信聊天記錄被刪除了應該怎麽回復?正常情況下是不可能恢復的

Kotlin 並沒有的那麼

kotlin 越來越火,但使用的越多發現不順手的地方也越多。 最近發現了崩潰: 11-17 00:54:07.355 266-266/? A/DEBUG: signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr -------

一直問自己怎樣才能把程式寫的更? 程式設計境界:乾淨利落,沒有任何多餘步驟 動態能力:反應,邏輯思維

yum 是 Fedora RHEL Centos SUSE等linux 發行版的 軟體包管理工具 通過 執行 man yum 檢視yum的幫助資訊 可以知道 yum makecache 是 將伺服器上的軟體包資訊 現在本地快取,以提高 搜尋 安裝軟體的速度 yum 主要的一

學web前端開發,哪個機構

是否 高效 規範 隨著 深入 十分 目前 前端工程師 深入淺出 學習web前端開發已然成為一種潮流,甚至有很多做後臺的轉行來學。學習web開發,選擇一家好的web前端開發機構至關重要。但是,現在各類的web前端開發機構如雨後春筍般迅速崛起,這也增加了我們的選擇難度。那麽,學

孩子幾歲的時候去武校習武?

孩子幾歲的時候去精武院http://www.jingwuyuan.cn/習武好呢?青少年學員去武術學校習武需要準備什麽呢?青少年去武術學校去什麽地方比較好呢?孩子們學習武術的黃金年齡http://www.jingwuyuan.cn/jiazhangguanzhu/2017/0613/119.html是

N!的階乘附帶簡單大整數類的輸入輸出(暫時沒有深入的了解)

ios sta 好的 n! width ear ati str cstring Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! 我的思路:就想著大整數類去了,才發現自己還不能很好的掌握,其實

依賴註入和控制反轉的理解,寫的太

ace 語法 應用開發 資料 註入組 depend 設計思想 top ioc容器 學習過spring框架的人一定都會聽過Spring的IoC(控制反轉) 、DI(依賴註入)這兩個概念,對於初學Spring的人來說,總覺得IoC 、DI這兩個概念是模糊不清的,是很難理解的,今

天氣預報公網查詢城市的天氣預報提示:查詢結果為空!,這城市或區域暫時不被支持

image blog 代碼 設置 天氣 原因 ... 暫時 eclips 如題, 見下圖: IDEA中參數為城市名稱, 報錯.查詢結果為空, 暫不支持. 參數設置為城市代碼, 查詢結果正常. eclipse查詢, 參數設置為城市代碼和城市名稱都可以. 原因不明....

暫時調的代碼 2325

public tree str fine swap print modify can efi #include <cstdio> #include <map> #define N 200000 using std::map; map&

DB2:在緩沖池 "1" 中當前沒有任何頁面可用. SQLCODE=-1218, SQLSTATE=57011, DRIVER=3.61.75

-1 width splay border span add title ima 問題 服務器端DB2數據庫最近頻繁報錯: 在緩沖池 "1" 中當前沒有任何頁面可用。. SQLCODE=-1218, SQLSTATE=57011, DRIVER=3.61.75 試驗發現簡

“MySQL 服務正在啟動 . MySQL 服務無法啟動 服務沒有報告任何錯誤”的解決方案

span 圖片 ffffff back 無法啟動 環境 ont class str Mysql安裝版本:5.7.20 安裝教程: 在 https://dev.mysql.com/downloads/mysql/ 頁面選擇zip包下載(archive 為存檔的意思)

文件操作,是一個存為字符串格式的登陸系統,有增刪改查的功能,但不是我要的

str repl 修改 blog 一個 ice body pwd 刪除 def register(NAME, PWD, TEL): with open(‘userdate.txt‘, ‘a‘, encoding=‘utf-8‘) as f: new

eclipse向tomcat部署站點發現沒有class文件

而不是 uil 指向 最終 會有 tomcat部署 現在 tomat 部署 其實大部分解決辦法在網上都有的,例如這裏: https://blog.csdn.net/shiyuehit/article/details/53262807 eclipse下無法自動編譯或編譯失敗等

懷疑自己的人沒有努力的價值

心情 自己的 成功 是個 出身 現在 輕松 要去 為我   我當然不能說現在的我是成功的,人生,大概就是如果不能一直贏下去,你就輸了。   從我的出身,再到現在坐在上海寶鋼月浦宿舍的我——這雖不是個了不得的地方,最該感謝的就是我的父親了,他為了家庭,為了我付出了很多。當然,

國內用什麽機房?哪的服務器

網絡通訊 單點故障 follow 高防服務 安全 href 中國電信 很多 ref 目前國內防護最好的電信機房,就是江蘇電信,鎮江電信數據中心位於江蘇省鎮江市潤州區電力路18號鎮江 電信局16樓,20G光釬直連中國電信節點骨幹網,16G金盾防火墻集群防護,增加機房網絡安全系

金融行業保密性比較強,購買什麽企業郵箱

郵件加密 文件夾 員工 公司 技術 監聽 是否 輸入 加鎖 我們公司是做金融的,金融公司對客戶資料保密性要求非常高,萬一員工離職帶走了客戶資料,對公司打擊是非常大的,這個時候選擇一個保密性的企業郵箱就顯得尤為重要。所以針對這個問題,我想分享一下經驗,以防大家走彎路。我自己試

【取什麼主題】沉浸式狀態列----統一Title欄高度

新手上路 直接po程式碼(複製的時候記得加上setBar) 先是網上很好找到的“通過設定全屏,設定狀態列透明” /** * 通過設定全屏,設定狀態列透明 * @param activity */ public static void

win10系統用啟用碼啟用,用dos命令來啟用,只能啟用半年時間,暫時沒找到永久的

自己之前用啟用工具啟用的,啟用時間好像是180天,即將到期了,於是在網上百度各種永久啟用方法,參照別人的方法,發現把自己的啟用狀態由啟用即將到期變為通知模式,瞬間一臉懵逼,於是找啊找,終於找到了這種方式,親測可行。 (1)首先檢視自己系統的啟用狀態;快捷鍵 win +r 輸入命令:slmgr.v

SetWindowsHookEx 函式,暫時沒有深入研究

SetWindowsHookEx https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx       在鉤子連結串列中安