C語言與匯編語言_第1頁
C語言與匯編語言_第2頁
C語言與匯編語言_第3頁
C語言與匯編語言_第4頁
C語言與匯編語言_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、匯編 & C Buffer.c:#include <stdio.h>#include <stdlib.h>int n,ip=0,op=0;char buf16,chr;bool oq(char bufo,int &opo,char &chro) if(n=0) return false; else chro=bufoopo; opo+; n-; return true; bool iq(char bufi,int &ipi,char &chri) if(n=16) return false; else bufiipi=chri;

2、ipi+; n+; return true; int main() n=0; char cho, a; printf("請(qǐng)選擇:0 退出程序;- 輸出一個(gè)字符;其它字符 進(jìn)入隊(duì)列n"); scanf("%c",&cho); while(cho!='0') scanf("%c", &a); if(cho='-') if (oq(buf,op,chr)!=0) printf("提取的元素是:%cn", chr); else printf("Empty!n&quo

3、t;); else printf("插入的元素是:n"); scanf("%c",&chr); scanf("%c", &a); if(chr >= 'a' && chr <= 'z' )| (chr >= 'A' && chr <= 'Z') if(iq(buf,ip,chr)=0) printf("Full!n"); printf("請(qǐng)選擇:n"); sca

4、nf("%c",&cho); return 0;部分反匯編:int main()010F10E0 push ebp 010F10E1 mov ebp,esp 010F10E3 sub esp,2Ch 010F10E6 push esi 010F10E7 push edi 010F10E8 lea edi,ebp-2Ch 010F10EB mov ecx,0Bh 010F10F0 mov eax,0CCCCCCCCh 010F10F5 rep stos dword ptr es:edi 010F10F7 mov eax,dword ptr _security_cook

5、ie (10F703Ch) 010F10FC xor eax,ebp 010F10FE mov dword ptr ebp-4,eax char badstr="000011112222333344445555"010F1101 mov ecx,6 010F1106 mov esi,offset _security_cookie-24h (10F7018h) 010F110B lea edi,ebp-24h 010F110E rep movs dword ptr es:edi,dword ptr esi 010F1110 movs byte ptr es:edi,byte

6、ptr esi int *pEIP=(int*)&badstr16;010F1111 lea eax,ebp-14h 010F1114 mov dword ptr ebp-2Ch,eax *pEIP=(int)hacked;010F1117 mov ecx,dword ptr ebp-2Ch 010F111A mov dword ptr ecx,offset ILT+0(_hacked) (10F1005h) CopyString(badstr);010F1120 lea edx,ebp-24h 010F1123 push edx 010F1124 call ILT+5(_CopySt

7、ring) (10F100Ah) 010F1129 add esp,4 return 0;010F112C xor eax,eax C語言的語言元素(1)數(shù)據(jù)類型分為三種: 基本類型:整型int、實(shí)型(浮點(diǎn)型)float、字符型char、枚舉類型。其中實(shí)型又分 為單精度型和雙精度型double。 構(gòu)造類型:數(shù)組類型,結(jié)構(gòu)體類型,公用體類型 指針類型 基本數(shù)據(jù)類型:基本數(shù)據(jù)類型最主要的特點(diǎn)是,其值不可以再分解為其它類型。也就是說,基本數(shù)據(jù)類型是自我說明的。 構(gòu)造數(shù)據(jù)類型:構(gòu)造數(shù)據(jù)類型是根據(jù)已定義的一個(gè)或多個(gè)數(shù)據(jù)類型用構(gòu)造的方法來定義的。也就是說,一個(gè)構(gòu)造類型的值可以分解成若干個(gè)“成員”或“元素”

8、。每個(gè)“成員”都是一個(gè)基本數(shù)據(jù)類型或又是一個(gè)構(gòu)造類型。(2)宏定義#define 指令:預(yù)處理命令例:#define PI 3.14一旦定義,可以代替常量使用宏定義不是常量!程序中應(yīng)優(yōu)先使用常量而不是宏宏定義可以防止一個(gè)頭文件被重復(fù)包含#ifndef COMDEF_H#define COMDEF_H/頭文件內(nèi)容#endif(3)編譯預(yù)處理命令#include,它在編譯開始時(shí),將另一個(gè)C源文件嵌入; #include“stdio.h” #include“string.h” #include“math.h”4)整型數(shù)據(jù)的定義及取值范圍類型 定義符 位數(shù) 數(shù)值范圍 整型 int 16位 -215(2

9、15)-1短整型 short 16位 同上長整型 long 32位 -231(231)-1無符號(hào) unsigned 16位 0(216)-1 無符號(hào)短整型 unsigned short 16位 0(216)-1 無符號(hào)長整型 unsigned long 32位 0(232)-1 注:xy等于x的y次冪 (5)常用格式I/O函數(shù)putchar(參數(shù))字符輸出函數(shù) 功能:向終端輸出一個(gè)字符 參數(shù):char or int型變量函數(shù)值:輸出參數(shù)的值。getchar( )字符輸入函數(shù) 功能:從終端輸入一個(gè)字符 參數(shù):無 函數(shù)值:從輸入設(shè)備得到的字符。printf格式輸出函數(shù) printf(格式控制,輸出

10、表列) “格式控制”是用雙引號(hào)括起來的字符串,包括:格式說明,由%和格式字符組成; 普通字符,即需原樣輸出的字符。 “輸出表列”是要輸出的一些數(shù)據(jù),可以是表達(dá)式如: printf(“a=%d,b=%d”,a,b); scanf格式輸入函數(shù) scanf(格式控制,地址表列) 格式控制:用%d,%o,%x,%c,%s,%f,%e 地址表列:由若干個(gè)地址組成的表列,可以是變量的地址,或字符串的地址。如: int a,b,c; scanf(“%d%d%d”,&a,&b,&c);匯編語言的語言元素(1) 語句 等值語句EQU格式:符號(hào) EQU 表達(dá)式表達(dá)式:常數(shù)或數(shù)值表達(dá)式、地址

11、表達(dá)式、變量或標(biāo)號(hào)。等號(hào)語句 格式:符號(hào) = 表達(dá)式數(shù)據(jù)定義語句 變量名 BYTEWORDDWORD. 表達(dá)式1,表達(dá)式2,.(2)運(yùn)算符格式:<運(yùn)算符> <地址表達(dá)式>運(yùn)算對(duì)象是存儲(chǔ)器操作數(shù),由變量名或標(biāo)號(hào)組成地址表達(dá)式。SEG: 返回變量所在的段值。OFFSET: 返回變量所在偏移量。TYPE: 返回變量的類型。LENGTH: 返回?cái)?shù)組變量的元素個(gè)數(shù)。SIZE: 返回?cái)?shù)組變量所占的總字節(jié)數(shù)。SIZE= TYPE* LENGTHPTR:類型 PTR 地址表達(dá)式類型可以是:BYTE ,WORD,DWORD 或NEAR,FAR僅在當(dāng)前語句中有效,是一種臨時(shí)設(shè)置。(3)整數(shù)

12、算術(shù)指令SHL/SHR:邏輯左右移位SAL/SAR:算術(shù)左右移位ROL/ROR:循環(huán)左右移位RCL/RCR:帶進(jìn)位的循環(huán)左右移位SHLD/SHRD:雙精度左右移位無符號(hào)乘法MUL指令有符號(hào)乘法IMUL指令無符號(hào)除法DIV指令有符號(hào)除法:CBW、CWD、CDQ指令用于整數(shù)符號(hào)擴(kuò)展CBW指令將AL中的符號(hào)位擴(kuò)展到AH中CWD指令將AX中的符號(hào)位擴(kuò)展到DX中CDQ指令將EAX中的符號(hào)位擴(kuò)展到EDX中(4) 宏程序中使用宏分為定義和調(diào)用兩個(gè)部分。宏定義用來說明哪些指令或偽指令是將 在程序中重復(fù)出現(xiàn)的程序段;宏調(diào)用是用來告訴匯編程序,在翻譯前先把宏定義 中的程序段復(fù)制一遍??梢?,宏定義和宏調(diào)用都是告訴匯

13、編程序如何處理,屬于 偽操作。 格式: 宏名 MACRO 宏體 ENDM宏調(diào)用:定義后的宏名又稱為宏指令。經(jīng)宏定義后,就可以在源程序中調(diào)用宏了。 宏調(diào)用的方式是在源程序中需要復(fù)制宏體的地方寫宏的名字。宏名單獨(dú) 占一行,當(dāng)源程序被匯編時(shí),匯編程序?qū)?duì)宏調(diào)用進(jìn)行宏體復(fù)制,并取 代宏名,這種復(fù)制操作稱為宏展開。宏的好處主要體現(xiàn)在每次調(diào)用而展開的宏體可以不同。這需要在宏定義時(shí)以形式 參數(shù)指明宏體中的哪些部分可以被不同的實(shí)際參數(shù)代替,每次調(diào)用時(shí)在宏名字的 后面附帶實(shí)際參數(shù)。完整的宏定義格式是: 宏名 MACRO 形式參數(shù)表 宏體 ENDM宏操作中形參與實(shí)參的對(duì)應(yīng)關(guān)系: 由于宏是偽操作,形參與實(shí)參的對(duì)應(yīng)方

14、法是由匯編程序決定的,與高級(jí)語言中形 參與實(shí)參的對(duì)應(yīng)方式有很大的不同。匯編語言規(guī)定: (1)形參表中的多個(gè)參數(shù)項(xiàng)之間必須用逗號(hào)分隔,但實(shí)參表的各個(gè)參數(shù)項(xiàng)可以用 逗號(hào)也可以用空格分隔。 (2)如果形參的數(shù)目與實(shí)參的數(shù)目相等,則按照形參表與實(shí)參表中各參數(shù)項(xiàng)的次 序一一對(duì)應(yīng)。 (3)如果形參數(shù)目少于實(shí)參數(shù)目,多余的實(shí)參被忽略,匯編程序不做任何提示。宏的嵌套 類似于在子程序中可以調(diào)用另一個(gè)子程序,在一個(gè)宏體中也允許再調(diào)用另一個(gè)已定義的宏。對(duì)這種宏中套宏的宏調(diào)用,匯編程序?qū)⒅鸫握归_,直到展開后的結(jié)果不再含有宏調(diào)用為止。設(shè)某程序中已定義了3個(gè)字型變量v1、v2、v3,下面是源程序中的一段。mm1 MACR

15、O x MOV AX,x MUL AX ENDMmm2 MACRO a,b,c mm1 a MOV BX,AX mm1 b ADD AX,BX MOV c,AX ENDM mm2 v1,v2,v3展開mm2后得到: mm1 v1 MOV BX,AX mm1 v2 ADD AX,BX MOV v3,AX(5) 子程序a)子程序是具有固定功能的程序段,并且有規(guī)定的格式。不同的計(jì)算機(jī)語言對(duì)子程 序格式的規(guī)定不同,匯編語言的子程序基本格式如下: 子程序名 PROC 類型 指令序列 子程序名 ENDP b)子程序相關(guān)指令 CALL指令 指令格式:CALL 子程序名 功能:這是調(diào)用子程序的指令。 RET指

16、令 功能:這是子程序返回指令,必須寫在子程序的指令序列之中。 子程序的調(diào)用與返回 在匯編語言程序中,子程序分為定義和使用兩部分。在較短的程序中,通常 把子程序與其余指令寫在同一個(gè)代碼段內(nèi),一個(gè)代碼段中可以定義多個(gè)子程 序,并且都定義成NEAR類型。這樣編寫的代碼段的基本結(jié)構(gòu)如下:段名 SEGMENT 子程序1 PROC NEAR 子程序1 ENDP 子程序2 PROC NEAR 子程序2 ENDP 子程序n PROC NEAR 子程序n ENDP 入口標(biāo)號(hào): 段名 ENDS宏與子程序的比較 : 1)處理的時(shí)間不同。宏調(diào)用是在源程序被匯編時(shí)由匯編程序處理的;而子程序調(diào) 用是在程序執(zhí)行期間由CPU

17、直接執(zhí)行的。 2)目標(biāo)代碼的長度不同。由于每一次宏調(diào)用都要進(jìn)行宏展開,把宏體中的內(nèi)容復(fù) 制一遍,因而用宏編寫的程序在目標(biāo)代碼中會(huì)重復(fù)出現(xiàn)相同或相似的程序段, 占用內(nèi)存空間大;而子程序是由CALL指令調(diào)用,無論調(diào)用多少次,子程序的 目標(biāo)代碼只在最終的執(zhí)行程序中出現(xiàn)一次,目標(biāo)代碼相對(duì)較短 3)處理的方式不同。宏必須先定義后調(diào)用,宏調(diào)用是用宏體替換宏調(diào)用偽指令, 實(shí)參代替形參,源程序被翻譯成目標(biāo)代碼后宏定義隨之消失;而子程序的調(diào)用 沒有這樣的替換操作,是以CALL指令將控制權(quán)由調(diào)用者轉(zhuǎn)給子程序 4)參數(shù)處理不同。宏調(diào)用是以實(shí)參代替形參,參數(shù)的形式不受制,可以是指令助 記符、寄存器名、標(biāo)號(hào)等;而子程序

18、的參數(shù)傳遞必須有確切的存放地 5)執(zhí)行速度不同。子程序調(diào)用時(shí)會(huì)比宏展開后的代碼多執(zhí)行CALL指令和RET 指令,以及需要附加的指令進(jìn)行參數(shù)傳遞,因而執(zhí)行速度稍慢。 總結(jié):編寫程序的過程中,對(duì)于程序中的重復(fù)部分,究竟是采用宏還是子程序,可以權(quán)衡 內(nèi)存空間、執(zhí)行速度、參數(shù)傳遞方法等各方面的因素后取舍。在大多數(shù)情況下,宏比子程序有更大的靈活性,且執(zhí)行速度快,在重復(fù)部分較短時(shí)經(jīng)常采用;而一個(gè)已經(jīng)驗(yàn)證過的子程序,可以做成目標(biāo)代碼存放在子程序庫中,在另一個(gè)程序中應(yīng)用時(shí)可不經(jīng)過匯編程序的翻譯,直接與需要使用它的程序連接在一起,從而避免宏展開后可能出現(xiàn)的語法及邏輯錯(cuò)誤。 C語言的具體實(shí)現(xiàn):C語言的全局變量和局

19、部變量C語言源碼:int a = 0x99;int g = 0x100;fun()int a = 0x10;g = a;fun1();fun1()int c = 0x11;a = c;g = a;匯編代碼:push bpmov bp, sppush simov si, 0010 ;局部變量int a = 0x10;mov ds:0002, si ;對(duì)全局變量賦值g = a;call 0023pop sipop bpretpush bp mov bp, sppush simov si, 0011 ;局部變量int c = 0x11;mov ds:0000, si ;對(duì)全局變量賦值a = c; m

20、ov ax, word ptr ds:0000mov word ptr ds:0002, ax ;以上兩句完成g = a的操作pop sipop bpret總結(jié):C語言將局部變量存儲(chǔ)于堆棧中,在函數(shù)結(jié)束時(shí)自動(dòng)清除,全局變量存儲(chǔ)于 定義的數(shù)據(jù)段中,在程序中全局變量定義后的函數(shù)中均可訪問。若定義了全 局變量和局部變量,在子函數(shù)中若存在與全局變量同名的局部變量,則使用 子函數(shù)中的局部變量,而不使用全局變量。 C語言指針變量作為函數(shù)參數(shù)C語言源碼:void swap(int *p1,int *p2);fuc()int a = 0x100;int b = 0x200;int *p1 = &a;i

21、nt *p2 = &b;swap(p1,p2);void swap(int *p1,int *p2) int p;p = *p1;*p1 = *p2; *p2 = p;匯編代碼:enter 4, 0push sipush dimov bp-4, 100h ;局部變量a a = 0x100mov bp-2, 200h ;局部變量b b = 0x200lea si, bp-4 ;局部變量p1 p1 = &alea di, bp-2 ;局部變量p2 p2 = &bpush di ;將p2壓棧push si ;將p1壓棧call sub_100B3 ;調(diào)用函數(shù)swappop cx pop cx ;堆棧平衡pop dipop sileaveretnsub_100B3:push bpmov bp, sppush si ;變量pmov bx, bp+4 ;取得變量p1,bx中現(xiàn)存放的是地址mov si, bx ;取得*p1,p = *p1mov bx, bp+6 ;取得變量p2,bx中現(xiàn)存放的是地址mov ax, bx mov bx, bp+4mov bx, ax ;以上三句完成*p1 = *p2mov bx, bp+6mov bx, si ;以上兩句完成*p2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論