計算機系統:硬件 + 軟件ubuntu
#
開頭的命令修改原始 C 程序,如:將incude
文件的內容插入到程序文本中。對於跨越多字節的程序對象,咱們須要確認:緩存
例如,變量x
類型爲int
,值爲0x01234567
,位於地址0x100
處,大端法和小端法存儲爲:sass
大端法:網絡
地址 | 0x100 | 0x101 | 0x102 | 0x103 |
---|---|---|---|---|
數據 | 01 | 23 | 45 | 67 |
小端法:併發
地址 | 0x100 | 0x101 | 0x102 | 0x103 |
---|---|---|---|---|
數據 | 67 | 45 | 23 | 01 |
整數運算:<Z , +, x, -, 0 ,1>
(0, 1 爲加法和乘法的單位元)函數
布爾代數:<{0, 1}, |, &, ~, 0, 1>
編碼
上面兩種結構有不少類似性,但注意~ a 不是 a 在 | 運算下的逆元(a | ~a != 0
, a + -a == 0
)操作系統
PS:線程
浮點數及其運算的標準:IEEE(讀做 I-Triple-E) 標準 754翻譯
符號 | 指數 | 有效數 | |
---|---|---|---|
單精度(32bit) | 1 | 8 | 23 |
雙精度(64bit) | 1 | 11 | 52 |
指數採用二進制移碼(Exponent bias)表示。
1 - Bias
(Bias 是指數域對應了二進制原碼值)// code.c int accum = 0; int sum(int x,int y){ int t = x + y; accum += t; return t; }
生成彙編文件:$ gcc -O2 -S code.c
編譯:$ gcc -O2 -c code.c
反編譯:$ objdump -d code.o
,結果入下
ubuntu@DESKTOP-5JD9B9T:~$ objdump -d code.o code.o: 文件格式 elf64-x86-64 Disassembly of section .text: 0000000000000000 <sum>: 0: 8d 04 37 lea (%rdi,%rsi,1),%eax 3: 01 05 00 00 00 00 add %eax,0x0(%rip) # 9 <sum+0x9> 9: c3 retq
尋址的通用形式Imm(Eb, Ei, s)
,其地址是Memory[Immediate + Register[Eb] + Register[Ei] * scale]
(當即數 + 基址 + 變址)
mov S, D
:S ---> D
加載有效地址(Load Effective Address)指令 leal 其實是 movl 指令的變形。
這條指令將第一個操做數計算出的地址寫入第二個操做數。
例如:leal 7(%edx, %edx, 4), %eax
將設置%eax
的值爲7 + %edx + 4 * %edx
。(%edx
爲 3,則%eax
設置爲 22)
一元操做:只有一個操做數,既是源又是目的。
二元操做:第二個操做數既是源又是目的。
跳轉(jump)指令會致使執行切換到程序中的一個全新的位置。這些跳轉的目的地一般用一個標號(label)指明。
執行 PC 相關尋址時,程序計數器的值是跳轉指令後面的那條指令的值,而不是跳轉指令自己的地址。處理器會將更新程序計數器做爲執行一條指令的第一步。例如:
地址 指令1 0x08 指令2 0x0a ... 指令n 0x1b 若是指令1的操做是跳轉到指令n,則偏移爲0x11,由於0x0a + 0x11 = 0x1b