初識彙編(csapp 第二版)

2021-08-17 06:50:29 字數 2119 閱讀 8744

組合語言其實處於高階語言和機器語言中間。機器語言雖然編寫出來的程式執行效率非常高,但是一串01010101真的太難看了。

組合語言的作用就是改善機器的可讀性,用一些符號來將cpu的各種資源符號化,簡單來說就是更容易閱讀和編寫啦。

組合語言是面向處理器的,它操作的物件是暫存器或者是儲存器,所以說速度也挺快,但是相對應的也變得複雜,不直觀。

picture1

at&t的組合語言格式如下,可能需要一些時間習慣一下。

(ppt來自湖南大學黃麗達老師講授的計算機系統)

(ppt來自湖南大學黃麗達老師講授的計算機系統)

我們了解到,mov指令後面有三種字尾,l,w和b,這意味著要移動的資料是多少位的。

(ppt來自湖南大學黃麗達老師講授的計算機系統)

movl $0x405,%eax這一條的意思是,直接把十六進製制資料0x405移入到eax暫存器中(聯想:我們的x86機器裡面有8個32位的暫存器,%exa是第乙個暫存器。但是我們這裡注意到,0x456是乙個3*4=12bit資料,所以說它前面要補0

其實這裡值得說明的是,一開始我並不認為$0x405指的是十六進製制的0x405,而是我認為要移動記憶體裡面位址為0x405的儲存單元裡面的值到%eax裡面。但是後來和老師交流發現,如果要實現我所說的,那麼就應該不加任何符號,就是直接的0x405。因為$後面加的資料,就認為是乙個直接數了。

movw %ax,%bx這裡的意思是,把暫存器%ax裡面的單位元組資料移入到暫存器%bx裡。這裡需要回顧一下,我們之前說了x86機器裡面有8個暫存器,名字分別為%eax,%ecx,%edx,%ebx,%esi,%edi,%esp,%ebp。在這裡每個暫存器的內部又會有一些小的部分。以%eax舉例,它是32位的,低16位城為%ax。在%ax裡面,高8位稱為%ah,低八位稱為%al)

movb $-17,(%esp)

這裡的意思是把單位元組資料-17移動到暫存器esp裡面儲存的位址所對應的記憶體單元裡。

在這裡(%esp)和之前%esp相比,多了乙個括號,這是說我們的資料並不是簡單的移動到暫存器%esp裡了!!%esp暫存器裡面存的位址對應的記憶體單元才是我們要去的地方~!

這裡介紹了一些定址的方式,其實我們直接關注最後一條就可以,因為最後一條是普遍適用的。這裡有一些不是那麼自然的對於我來說。例如

*這裡的括號外面不是乙個係數噢,而是乙個「偏移量「,直接加加減減的。

*比例係數是和挨他最近的乙個暫存器值相乘

(ppt來自湖南大學黃麗達老師講授的計算機系統)

解讀一下這道題

260(%edx,%ecx)指的是我們要取的值,位於260+%edx對應的值+%ecx對應的位址的記憶體單元內。

根據右邊的圖,我們看出了,%edx儲存的值為0x3,%ecx儲存的值為0x1,0x1+0x3=0x4,0x4+260這裡涉及到了進製轉換

260=0x104,0x104+0x4=0x108,在記憶體位址為0x104的記憶體單元中,儲存了0x13。

(ppt來自湖南大學黃麗達老師講授的計算機系統)

在這裡0xf4(,%edx,4)指的是我們要取的值,記憶體位址為0xf4+%edx*4的記憶體單元中。

根據右邊的圖,我們看出了,%edx儲存的值為0x3, 0x3*4=0xc,0xc+0xf4這裡涉及到了進製,c+4=16進1,f+1=16進1,所以等於0x100,在記憶體位址為0x100的記憶體單元中,儲存了0xff。

初識暫存器,字,大端小端(csapp第二版)

暫存器的處理速度相當快,它的基本單元是d觸發器,操作速度快,但是儲存容量小,占用面積大,所以數量相較而言較少。ppt來自湖南大學黃麗達老師教授的計算機系統 從圖中可以看出,我們的8個32位暫存器都有固定的名稱。通常來說,暫存器都是由它的名稱代表,而不說它的位址,位址常見於指代記憶體的儲存單元。學習彙...

王爽彙編第二版實驗5

1 assume cs code,ds data,ss stack data segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h data ends stack segment dw 0,0,0,0,0,0,0,0 stack end...

王爽彙編第二版實驗4

1 程式設計,向記憶體0 200 0 23f依次傳送資料0 63.assume cs code code segment start mov ax,0020h mov ds,ax mov bx,0 mov cx,40h s mov bx bx inc bx 每次移動一位,覆蓋高位,保留低位 loop...