從高階語言到彙編1

2021-04-12 22:44:13 字數 2051 閱讀 9693

寫作目的:

學了很多東西,c,a**等等但不能做到融會貫通,想通過寫來提高自己。而且在學彙編時深刻地感受到了彙編的障礙在於複雜,所以從熟悉的入手,一點點地深入,就像網上流傳的《組合語言的藝術》一書類似。第三,我也買了《深入理解計算機系統》一書,但沒看完,在寫作的使用,作為參考也可以系統的看一遍,不至於浪費。

第一篇  變數的長度及變數賦值

變數的賦值 變數賦值是給已宣告的變數賦給乙個特定值。

乙個簡單的例子,對單個變數的賦值( 如果沒有特殊的宣告我們這裡的變數都是指整型變數,畢竟浮點數要涉及浮點指令),這種變數在c語言中採用下列格式賦值

變數名=表示式; 

例如:main() 

用vc++6彙編出來的**為:

8:        int a,b,c;

9:        a=1;

0040d708   mov         dword ptr [ebp-4],1             ;將1移動到變數a

10:       b=2;

0040d70f   mov         dword ptr [ebp-8],2              ; 將2移動到變數b

11:       c=a+b;

0040d716   mov         eax,dword ptr [ebp-4]          ;將變數a的值移動到暫存器eax

0040d719   add         eax,dword ptr [ebp-8]           ;將變數a的值加上變數b,結果放在eax

0040d71c   mov         dword ptr [ebp-0ch],eax      ;將eax中的結果移動到變數c

12:       printf("%d/n",c);

0040d71f   mov         ecx,dword ptr [ebp-0ch]

0040d722   push        ecx

0040d723   push        offset string "hello world!/n" (0042201c)

0040d728   call        printf (00401060)

0040d72d   add         esp,8

13:       return 0;

0040d730   xor         eax,eax

從上面的**中我們看到了,對於賦值語句如上所示:

9:        a=1;

0040d708   mov         dword ptr [ebp-4],1

在彙編中乙個變數就代表乙個記憶體位址(長度先不考慮),可以使用mov指令將乙個立即數移動到變數中。

深入一:

關於mov指令,在彙編中叫做傳送指令。

傳送指令是使用最頻繁的指令,它相對於高階語言裡的賦值語句。指令的格式如下:

mov  reg/mem, reg/mem/imm

其中:reg—register(暫存器),mem—memory(儲存器),imm—immediate(立即數),它們可以是8位、16位或32位。

指令的功能是把源運算元(第二運算元)的值傳給目的運算元(第一運算元)。指令執行後,目的運算元的值被改變,而源運算元的值不變。

深入二:

變數型別,在高階語言中每乙個變數都有其特定的型別,這樣就可以在編譯的使用告訴編譯器給變數留多大的儲存空間。而在組合語言中是沒有型別概念的,組合語言只標示變數的長度。

位元組變數的定義符為db/byte(define byte),每個位元組只佔乙個位元組單元。

字變數的定義符為dw/word(define word),每個字占用兩個連續的位元組單元。

雙字變數的定義符為dd/dword(define doubleword),每個雙字變數占用二個連續的字單元(四個位元組)。

在上面的程式中,我們將a,b,c三個變數都定義為int型。在預設的32位環境中,int型別的長度為4位元組,所以我們可以看到在變數中設定的長度都為dd/dword(define doubleword),每個雙字變數占用二個連續的字單元(四個位元組)。

組合語言 1

程式語言 組合語言 assembly language 是一種用於電子計算機 微處理器 微控制器或其他可程式設計器件的低階語言,亦稱為符號語言。在組合語言中,用助記符 mnemonics 代替機器指令的操作碼,用位址符號 symbol 或標號 label 代替指令或運算元的位址。在不同的裝置中,組合...

從C語言到彙編,從彙編到C語言

看雪一同志寫的文章,我覺得很基礎和有用,知識著眼於小處。積累才是王道!一 迴圈語句與發彙編後的機器語言 1 for迴圈 下面是一段c語言的 我們的目的是來看其反彙編的結果 int myfunction int a,int b return c 前面的反彙編暫時不理它,這裡從for的地方開始反彙編,結...

1 從組合語言到Windows核心程式設計筆記 1

彙編部分 1 call 的本質相當於 push jmp,ret 的本質相當於 pop jmp。2 windows中,不管哪種呼叫方式都是返回值放在 eax中,然後返回。外部從 eax中得到值。3 ebp總是被我們用來儲存這個函式執行之前的 esp的值。4 把區域性變數區域初始化成全0cccccccc...