1. 程式人生 > >組合語言程式設計( 利用c語言快速理解彙編)

組合語言程式設計( 利用c語言快速理解彙編)

文章目錄

組合語言程式設計

一 操作碼和運算元

1 操作碼

指令執行的操作(加減,傳送)

2 運算元

指令操作的資料
mov 操作碼用於資料傳送,功能,將資料從一個位置傳送到另一個位置

mov dest,src ; 相當於c語言的賦值語句   dest = src 

src 表示要傳送的資料或者資料所在的位置
dest 表示資料將要傳送到的位置
將暫存器ebx傳送到eax 的指令

mov eax,ebx    

3 語句格式

執行性語句: 表達處理器指令的語句,對應一條指令程式碼

標號:處理器指令助記符    運算元,運算元    

說明性語句:表達彙編程式命令的語句,主要說明源程式如何彙編,變數如何定義,過程如何設定

名字     偽指令助記符    引數,引數,....... 
  1. 冒號前的標號表示處理器指令在主存裡面的位置,主要用來指示分治,迴圈等程式的目的地址
  2. 名字 可以使變數名,段名,子程式名
    標號和名字的命名方式都和c,c++ 語言相同,注意不區分大小寫
  3. 助記符:幫助記憶指令的符號,反應指令的功能。
    處理器助記符:處理器指令,表示處理器的一種操作
    偽指令助記符:byte,等,表明資料型別,在主存中分配若干的儲存空間,用於儲存變數值
    例如:
    msg byte 'Hello',13,10,0
    用c語言描述就是 char *msg = "Hello\n'  其中0 表示字串結束
    
    msg 有段基地址和偏移地址,可以用offset 獲得其偏移地址
    mov eax offset msg     ; eax 獲得 msg的偏移地址並將其放到eax暫存器
    

4 源程式框架

		include io32.inc     ; 相當於c語言包含標頭檔案
		.data  					 ;  資料段,相當於c語言事先宣告一些常量大的值
		......

 		.code					 ; 程式碼段   執行的程式碼
 start: 						     ; 相當於c語言的int main() 程式從這裡開始
 		.....
 		eixt 0					; 相當於return 0;
 		...							; 這裡定義子程式,相當於c語言的函式
 		end start				; 對應start 表示程式段的結束

庫函式

庫函式呼叫方式:

call 函式名
1. DISPMSG      

二 資料定址方式

子程式

		printf("%s",a)  a = eax 暫存器裡的地址 			             
			DISPMSG  	 	入口引數,EAX = 字串地址 , 顯示字串   
		printf("%c",a) 	a = eax 的前八位,表示字元的ASCII		
			DISPC    			入口引數,  EAX 的前八位為字元的ASCII 為一個type型別,表示一個字元 
		printf("\n")         		
			DISPCRLF 		回車換行
		    DISPRD 輸出八個32 位通用暫存器內容
			DISPRF	 顯示6個狀態標誌的狀態
       printf("%lx",a)  a = EAX 暫存器裡的32位資料
       		DISPHD    以十六進位制列印
       		DISPSID   無符號十進位制整數輸出
       		READMSG   EAX = 快取器地址,功能:輸入一個字串(回車結束)
       scanf("%d",&a) eax = a 		
       		READC 	     EAX的前八位 = 字元的ASCII,輸入一個字元
       		READHD     輸入一個8位十六進位制數
       		READUID    輸入一個32位無符號十進位制整數
       		READSID    輸入一個32位有符號十進位制整數
    ```