中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

我的匯編學(xué)習(xí)之路(1):指令
來源:易賢網(wǎng) 閱讀:1606 次 日期:2015-04-02 14:09:40
溫馨提示:易賢網(wǎng)小編為您整理了“我的匯編學(xué)習(xí)之路(1):指令”,方便廣大網(wǎng)友查閱!

引言

我們很多人是開發(fā)者,每天寫大量的代碼,有時(shí)也不是糟糕的代碼。每個(gè)人都能很輕松寫下這樣的代碼:

#include <stdio.h>

int main() {

int x = 10;

int y = 100;

printf("x + y = %d", x + y);

return 0;

}

大家都能理解上面這段 C 語言代碼完成的功能,但是…這段代碼底層是如何工作的呢?我想我們中間不是所有人都能回答這個(gè)問題,我也不能。我認(rèn)為我可以用高級(jí)編程語言寫代碼,例如 Haskell、Erlang、Go 等等,但是我完全不知道在編譯之后它在底層是如何工作的。所以,我決定往下再深入一步,到匯編這個(gè)層次,并且記錄下我的學(xué)習(xí)匯編之路。希望這是有趣的過程,而不是僅僅對(duì)我一個(gè)人。大約五、六年前我已經(jīng)使用過匯編來寫簡單的程序,那時(shí)我還在上大學(xué),用的是 Turbo 匯編和 DOS 操作系統(tǒng)。現(xiàn)在我使用 Linux-x86_64 操作系統(tǒng),是的,64 位 Linux 和 16 位 DOS 肯定有很大的不同。那我們就開始吧。

準(zhǔn)備階段

在開始之前,我們需要準(zhǔn)備一些我接下來要提到的東西。我使用的是 Ubuntu(Ubuntu 14.04.1 LTS 64 位) 系統(tǒng),因此我的文章都是基于該操作系統(tǒng)和體系結(jié)構(gòu)的。不同的 CPU 支持不同的指令集,我使用的是 Intel Core i7 870 處理器,所有代碼都在這上面運(yùn)行。另外我將用 nasm 匯編,你可以用下面命令來安裝:

sudo apt-get install nasm

I它的版本應(yīng)該是 2.0.0 或者更高了。我是用的是 2013年12月29日編譯的 NASM version 2.10.09 版本。最后一部分,你需要一款寫匯編代碼的文本編輯器,我使用配有 nasm-mode.el 的 Emacs 編輯器。當(dāng)然這不是強(qiáng)制性的,你可以選擇任何你喜歡的文本編輯器。如果你像我一樣使用的是 Emacs,你可以下載 nasm-mode.el,將你的 Emacs 配置成這樣:

(load "~/.emacs.d/lisp/nasm.el")

(require 'nasm-mode)

(add-to-list 'auto-mode-alist '(".(asm|s)$" . nasm-mode))

這就是目前我們需要準(zhǔn)備的所有東西,其它工作在接下來的文章中會(huì)提到。

x64 語法

這里我就不全面介紹匯編的語法了,我們僅提一下這篇文章中用到的語法。通常 NASM 程序會(huì)被劃分為不同的段(section),這篇文章中我們會(huì)涉及到兩個(gè)段:

數(shù)據(jù)段(data section)

代碼段(text section)

數(shù)據(jù)段用來定義常量(constant),常量是在運(yùn)行時(shí)不會(huì)改變的數(shù)據(jù)。你可以定義數(shù)字或其他常量等等,聲明一個(gè)數(shù)據(jù)段的語法如下:

section .data

代碼段是存放代碼(code)的,該段必須以 global_start 開始,告訴內(nèi)核這里是程序開始執(zhí)行的地方。

section .text

global _start

_start:

注釋是以 ; 開始。每個(gè) NASM 代碼行包含下面四個(gè)字段的組合:

[label:] instruction [operands] [; comment]

中括號(hào)括起來的字段表示是可選的。基本 NASM 指令由兩部分組成,第一部分是需要執(zhí)行指令的名字,第二部分是該指令的操作數(shù)。例如:

MOV COUNT, 48 ;將數(shù)值 48 存放到 COUNT 變量中

Hello world

讓我們用 NASM 匯編來寫第一個(gè)程序吧,當(dāng)然是傳統(tǒng)的打印 “Hello world” 的程序。這是代碼:

section .data

msg db "hello, world!"

section .text

global _start

_start:

mov rax, 1

mov rdi, 1

mov rsi, msg

mov rdx, 13

syscall

mov rax, 60

mov rdi, 0

syscall

的,看起來不像 printf(“Hello world”),我們?cè)囍ダ斫馑鞘裁础⒃趺垂ぷ鞯摹O瓤?1-2 行,我們定義了一個(gè)數(shù)據(jù)段,并且有一個(gè) msg 常量,值為 Hello world,那么我們就可以在代碼中使用這個(gè)常量了。下一步是定義了一個(gè)代碼段,以及程序的入口,代碼從第 7 行開始執(zhí)行。現(xiàn)在到了程序最有意思的部分了。我們已經(jīng)了解了 mov 指令的功能,它帶有兩個(gè)操作數(shù),將第二個(gè)操作數(shù)的值放到第一個(gè)操作數(shù)中。但是,rax、rdi 等等這些是什么呢?我們找到維基百科的解釋:

中央處理單元(CPU)是計(jì)算機(jī)中的硬件,它讀取計(jì)算機(jī)程序中的指令,完成系統(tǒng)中基本的算術(shù)、邏輯、輸入/輸出操作。

好了,CPU 完成一些操作,例如算術(shù)操作等,但是它從哪獲得操作的數(shù)據(jù)呢?第一個(gè)答案是內(nèi)存。然而從內(nèi)存中讀取和存入數(shù)據(jù)的速度遠(yuǎn)遠(yuǎn)低于處理器的速度,它涉及到復(fù)雜的通過控制總線來發(fā)送數(shù)據(jù)請(qǐng)求的過程。因此,CPU 有其內(nèi)部的存儲(chǔ)位置,稱為寄存器(register)。

x64_registers

那么我們寫 mov rax, 1,意思是將 1 放到 rax 寄存器中。現(xiàn)在我們知道什么是 rax、rdi、rbx 等等了吧,但是還需要知道什么時(shí)候使用 rax,什么時(shí)候使用 rsi 等等。

rax —— 臨時(shí)寄存器,當(dāng)我們調(diào)用系統(tǒng)調(diào)用時(shí),rax 保存系統(tǒng)調(diào)用號(hào)

rdx —— 用來向函數(shù)傳遞第三個(gè)參數(shù)

rdi —— 用來向函數(shù)傳遞第一個(gè)參數(shù)

rsi —— 用來向函數(shù)傳遞第二個(gè)參數(shù)的指針

換句話說,我們就是調(diào)用了 sys_write 系統(tǒng)調(diào)用,該函數(shù)原型是:

ssize_t sys_write(unsigned int fd, const char *buf, size_t count)

它有三個(gè)參數(shù):

fd —— 文件描述符,0、1、2 分別代表標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤

buf —— 字符數(shù)組的指針,用來保存從 fd 指向的文件中獲取的內(nèi)容

count —— 表示要從文件中讀入到字符數(shù)組的字節(jié)數(shù)

我們知道 sys_write 系統(tǒng)調(diào)用帶有三個(gè)參數(shù),它在系統(tǒng)調(diào)用表中有一個(gè)系統(tǒng)調(diào)用號(hào)。我們?cè)倏纯闯绦虻膶?shí)現(xiàn),將 1 放到 rax 寄存器中,它意思是我們使用 sys_write 系統(tǒng)調(diào)用;下一行將 1 存到 rdi 寄存器,它是 sys_write 的第一個(gè)參數(shù),1 代表標(biāo)準(zhǔn)輸出;然后我們將 msg 的指針存到 rsi 寄存器中,這是 sys_write 的第二個(gè)參數(shù) buf;接著我們傳遞 sys_write 最后一個(gè)參數(shù)(字符串的長度)到 rdx 寄存器中。現(xiàn)在,我們有了 sys_write 的所有參數(shù),就可以在 11 行使用 syscall 來調(diào)用它了。好了,我們打印出 “Hello world” 字符串,現(xiàn)在需要從程序中正確退出。我們傳遞 60 到 rax 寄存器,60 是 exit 的系統(tǒng)調(diào)用號(hào);以及將 0 傳遞給 rdi 寄存器,這是錯(cuò)誤碼,0 表示我們的程序正確地退出。這就是 “Hello world” 的所有分析,相當(dāng)簡單吧:)現(xiàn)在我們編譯程序,假設(shè)我們的程序放在 hello.asm 文件中,那么我們需要運(yùn)行下面的命令來執(zhí)行:

nasm -f elf64 -o hello.o hello.asm

ld -o hello hello.o

編譯鏈接完成之后,我們得到可執(zhí)行文件 hello,可以使用 ./hello 來運(yùn)行,可以在終端看到輸出 “Hello world”。

總結(jié)

本文用一個(gè)簡單不能再簡單的程序開始第一部分,接下來我們會(huì)看到一些算術(shù)運(yùn)算。如果你有任何問題或者建議可以給我評(píng)論。

更多信息請(qǐng)查看IT技術(shù)專欄

更多信息請(qǐng)查看技術(shù)文章
易賢網(wǎng)手機(jī)網(wǎng)站地址:我的匯編學(xué)習(xí)之路(1):指令
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2026上岸·考公考編培訓(xùn)報(bào)班

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
国产综合欧美在线看| 国产精品夜色7777狼人| 亚洲色在线视频| 精品成人在线观看| 欧美精品videossex性护士| 久久久久久久欧美精品| 欧美一区二区视频97| 亚洲一区二区日本| 亚洲欧洲在线看| 一区二区三区在线不卡| 国产又爽又黄的激情精品视频| 欧美午夜精品理论片a级按摩| 欧美日韩123| 欧美黄色成人网| 久久久久综合网| 欧美成人午夜激情| 欧美精品亚洲二区| 国产精品久久网| 欧美午夜精品| 欧美视频一区二区在线观看| 久久亚洲美女| 欧美日韩国产丝袜另类| 欧美看片网站| 欧美视频日韩| 国产欧美一区二区精品婷婷 | 久久免费黄色| 久热这里只精品99re8久| 欧美精选一区| 国产精品国内视频| 激情综合视频| 亚洲精品一品区二品区三品区| 亚洲精品视频二区| 久久国产精品高清| 欧美激情一区二区三区蜜桃视频| 国产精品久久久久国产精品日日| 国产视频综合在线| 亚洲精品小视频| 久久激情综合| 欧美另类videos死尸| 国产精品一区久久久| 国产一区二区三区的电影| 亚洲影院污污.| 免费不卡在线观看| 黄色成人在线免费| 中文国产一区| 欧美va天堂| 国产欧美一区二区精品性| 亚洲国产日日夜夜| 欧美金8天国| 亚洲国产精品va在线看黑人| 久久精品道一区二区三区| 国产精品毛片va一区二区三区| 亚洲成色777777在线观看影院| 亚洲一区二区在线免费观看| 国产精品成人观看视频免费| 99re6这里只有精品| 欧美久久久久久蜜桃| 狠狠色噜噜狠狠色综合久| 亚洲午夜精品福利| 模特精品裸拍一区| 日韩亚洲成人av在线| 欧美sm极限捆绑bd| 日韩午夜在线电影| 欧美日韩国产三级| 亚洲视频导航| 激情一区二区三区| 欧美日韩在线三级| 午夜精彩国产免费不卡不顿大片| 国产午夜精品一区理论片飘花| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美第一黄网免费网站| 亚洲电影在线看| 国产精品一区免费在线观看| 久久亚洲一区二区| 亚洲激情小视频| 国产乱码精品一区二区三区av| 亚洲欧美变态国产另类| 国产色产综合色产在线视频| 蜜桃久久av一区| 欧美一区二区三区视频在线| 一区二区在线观看视频| 国产精品sm| 久久精品亚洲乱码伦伦中文| 亚洲欧洲精品一区二区精品久久久| 国产精品久久久久久一区二区三区| 久久精品1区| 亚洲精品系列| 国产精品日韩精品欧美在线| 欧美一区视频| 一本大道久久a久久精品综合| 国产日韩一区欧美| 欧美巨乳在线| 久久青青草原一区二区| 亚洲人成免费| 国内精品久久久久久久果冻传媒| 欧美日韩1区| 久久久999精品视频| 99视频有精品| 国产欧美日韩精品丝袜高跟鞋| 欧美四级电影网站| 欧美日本韩国一区二区三区| 久久久青草婷婷精品综合日韩| 一区二区三区久久网| 亚洲经典在线| 亚洲免费黄色| 亚洲裸体在线观看| 99精品热视频| 亚洲视频免费| 99国产精品国产精品毛片| 极品日韩久久| 夜夜嗨av色综合久久久综合网| 亚洲毛片视频| 国产精品久久久久久超碰| 欧美日韩另类视频| 精品动漫av| 国产精品高潮呻吟久久| 久久久久88色偷偷免费| 亚洲午夜久久久久久尤物| 亚洲欧美综合精品久久成人| 欧美一区二区三区在线观看 | 老**午夜毛片一区二区三区| 美女精品在线观看| 欧美激情久久久久| 国产精品视频yy9099| 在线电影一区| 亚洲欧美视频| 欧美成人综合一区| 国产精品xxxxx| 1024国产精品| 亚洲影音一区| 蜜桃av一区二区| 久久久久久久综合色一本| 狠狠色噜噜狠狠狠狠色吗综合| 美日韩精品视频免费看| 亚洲欧美999| 一区二区三区导航| 最新国产成人在线观看| 国产精品揄拍一区二区| 亚洲国产日韩美| 国产精品久久久久久久久久直播| 欧美成人激情视频| 模特精品裸拍一区| 美女视频黄 久久| 国产精品美女久久| 一区二区在线观看av| 亚洲综合清纯丝袜自拍| 欧美日韩一区自拍| 伊人久久噜噜噜躁狠狠躁| 亚洲欧美亚洲| 国产麻豆精品在线观看| 亚洲精品小视频在线观看| 亚洲欧美日韩国产精品 | 亚洲乱码国产乱码精品精天堂 | 亚洲三级电影全部在线观看高清| 午夜久久一区| 国产伦理一区| 亚洲欧美卡通另类91av| 欧美精品电影| 亚洲天堂第二页| 狂野欧美激情性xxxx| 欧美欧美在线| 亚洲一级在线观看| 国产视频一区欧美| 欧美亚洲专区| 国产欧美精品xxxx另类| 欧美影院视频| 亚洲国产精品久久人人爱蜜臀| 亚洲黄色在线观看| 欧美日本三区| 欧美专区一区二区三区| 91久久精品国产91久久性色tv| 欧美激情亚洲国产| 亚洲精品久久久蜜桃| 国产精品久久久久一区| 久久精品国产69国产精品亚洲 | 日韩一级在线观看| 国产一区91| 欧美日韩在线精品| 亚洲激情视频在线播放| 国产日韩一区二区三区| 欧美不卡三区| 亚洲毛片在线免费观看| 欧美另类女人| 亚洲自拍偷拍福利| 伊人久久大香线蕉av超碰演员| 亚洲在线视频观看| 国产色产综合色产在线视频| 免费成人美女女| 午夜精品久久久久久久99黑人| 99国产精品国产精品毛片| 国产精品视频99| 欧美成人综合一区| 久久伊人精品天天| 亚洲午夜电影网| 亚洲欧洲一区二区三区在线观看| 好看的亚洲午夜视频在线| 国产精品婷婷午夜在线观看| 午夜精品影院| 亚洲剧情一区二区| 国产主播精品在线|