寫作目的:
學了很多東西,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...