組合語言程式設計學習筆記(一)(Linux 版)
參考《組合語言程式設計》
1.每條指令碼都是從記憶體中讀取的,指令碼所需的資料也是儲存在記憶體中並從記憶體中讀取。
包含指令碼的記憶體位元組和包含處理器所用的資料的位元組沒有區別。
2.區分資料和指令碼--資料指標和指令指標。
3.資料指標幫助處理器瞭解記憶體中資料區域的起始位置是哪裡,這個資料區域稱為堆疊。
堆疊指標:用於指向堆疊中的下一個記憶體位置以便放入或者取出資料。
4.資料表示--小尾數表示法。
4位元組表示一個數據值,比如 01 00 00 00,這個值表示1,而不是 64.
5. 高階語言:
long testvalue = 150;
char message[22] = {"This is a test message"};
float pi = 3.14159;
組合語言:
testvalue:
.long 150
message:
.ascii "This is a test message"
pi:
.float 3.14159
6.執行速度
低階潛在印數的整數執行單元--加法/減法,布林操作,奔騰4處理在每個時鐘週期能夠完成兩個低階潛在因素的整數操作。
2.複雜整數執行單元,在4個時鐘週期之內處理大多數移位和迴圈指令。
3.乘法和除法操作通常需要花費14-60個時鐘週期。
4.浮點執行單元包含處理長度從64位到128位的資料元素的暫存器,應用在數字訊號處理和視訊壓縮上--相對應的指令為MMX和SSE。
7.多執行緒是針對軟體技術。而超執行緒是針對硬體技術。
8.Intel 的對手 AMD,(本機使用AMD晶片)。
9. Linux 下流行的彙編器是gas,而不是nasm,也不是window環境下的masm。彙編命令是as。
10. 可以將C程式彙編成組合語言程式。
gcc -S test.c
11.gdb 的圖形化介面 - - kdbg
Makefile:
all: as -gstabs -o hello.o hello.s ld -dynamic-linker /lib/ld-linux.so.2 -o hello -lc hello.o #注意加入除錯引數-gstabs 可執行檔案的大小會變大 #-dynamic-linker 動態地查詢和載入庫檔案的程式 #-lc 載入c庫 #break *_start+1 clean: rm -rf hello
# hello.s ----> intel彙編的註釋用的; 而ATT用的# # display a string "Hello, world." .section .rodata msg: .ascii "Hello, world.\n" .section .text .globl _start _start: nop #為了斷在main上,否則如果斷點設定在_start movl $2, %eax #呼叫fork系統呼叫 int $0x80 movl $4, %eax # system call 系統呼叫號(sys_write) movl $1, %ebx # file descriptor 引數一:檔案描述符(stdout) movl $msg, %ecx # string address 引數二:要顯示的字串 movl $14, %edx # string length 引數三:字串長度 int $0x80 # 呼叫核心功能 pushl $0 call exit #退出(exit) #movl $1, %eax # 系統呼叫號(sys_exit) #movl $0, %ebx # 引數一:退出程式碼 #int $0x80 # 呼叫核心功能