CSAPP第三章之資料傳送指令與棧指令

2021-10-12 10:20:55 字數 1447 閱讀 4051

接下來的內容不需要全部記住!只需要記住常用指令即可!

使用最頻繁的指令。

將不同的指令劃分位指令類,每一類中的指令執行相同的操作,唯一的區別是運算元大小不同

movb

movw

movl

movq

movabsq

mov s,d=> (s => d)

源運算元限定的值為立即數,儲存在暫存器或者記憶體中

目的運算元是乙個位址,在記憶體或暫存器中

限制:傳送指令的兩個運算元不能都指向記憶體位置:將乙個值從乙個記憶體位置複製到另乙個記憶體位置需要兩條指令,先將其載入到暫存器中,再載入到指定位置。

暫存器的大小必須與指令最後乙個字元指定的大小匹配。

movl以暫存器為目的時會將該暫存器的高位設定為0

movabsq以任意64位立即數作為源運算元,並且只能以暫存器作為目的

movzbw

movzbl

movzbq

movzwl

movzwq

和movsbw

movsbl

movsbq

movswl

movswq

movslqcltq(注:該指令值只作用於%eax與%rax。它沒用運算元,以%eax為源,以%rax為符號擴充套件結果的目的)

注意,movslq是存在的,但是movzlq是不存在的。該指令可以使用movl來實現

引數通過暫存器傳送給函式

返回值:%rax第乙個引數:%rdi第二個引數:%rsi

…pushq、popq能將資料壓入棧或彈出資料

在x86-64種,程式棧存放在記憶體的某個區域

棧頂元素的位址是所有棧元素中位址最低的

pushq和popq都只有乙個引數,即資料**與彈出的資料目的

push:需要將棧頂位址去相應的字大小

pushq %rbp==subq $8, %rsp movq %rbp, (%rsp)

區別:pushq指令編碼佔乙個位元組,另外一種實現方式佔兩個位元組

指令描述

pushq s

將四字壓入棧

popq d

將四字彈出棧

因為棧與其它形式資料都是放在同乙個記憶體中的,因此,程式可以用標準的記憶體定址方法訪問棧內的任意位置

工作學習筆記 CSAPP第三章

一 可變長陣列 剛開始學習c語言時,都會被教到,宣告陣列時,陣列的維數只能使用常量,也就是只能宣告定長陣列。如果資料個數不定的話,就要使用malloc動態分配。當時只是死記硬背,並沒有想想這是什麼道理。工作中了解到,函式中宣告的陣列一般儲存在棧上,陣列元素通過棧指標加偏移量和下標偏移來訪問。那時就已...

CSAPP第三章作業題

這一章讀了蠻久,中間又抽了點時間出去玩。實驗的部分,等讀完整本書書之後再進行。本章課後習題,網上找不答案也是b了狗了。有幾道題目,想了蠻久的。3.59 x xh264 xl y yh 264 x l xy 264 xhyl xly h x lyl 所以,ph xhy l xl yh x lyl 26...

第三章,檢索資料

select prod name from products 上述語句利用select 語句從products表中檢索乙個名為prod name的列,所需要的列名在select 關鍵字之後給出,from關鍵字指出從其中檢索資料的表名 select prod name,prod id,prod nam...