![C語言與匯編語言_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/31/1a9e0a00-02b6-4cc8-92b0-18744f2d7812/1a9e0a00-02b6-4cc8-92b0-18744f2d78121.gif)
![C語言與匯編語言_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/31/1a9e0a00-02b6-4cc8-92b0-18744f2d7812/1a9e0a00-02b6-4cc8-92b0-18744f2d78122.gif)
![C語言與匯編語言_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/31/1a9e0a00-02b6-4cc8-92b0-18744f2d7812/1a9e0a00-02b6-4cc8-92b0-18744f2d78123.gif)
![C語言與匯編語言_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/31/1a9e0a00-02b6-4cc8-92b0-18744f2d7812/1a9e0a00-02b6-4cc8-92b0-18744f2d78124.gif)
![C語言與匯編語言_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/31/1a9e0a00-02b6-4cc8-92b0-18744f2d7812/1a9e0a00-02b6-4cc8-92b0-18744f2d78125.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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("請選擇:0 退出程序;- 輸出一個字符;其它字符 進入隊列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("請選擇: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)數據類型分為三種: 基本類型:整型int、實型(浮點型)float、字符型char、枚舉類型。其中實型又分 為單精度型和雙精度型double。 構造類型:數組類型,結構體類型,公用體類型 指針類型 基本數據類型:基本數據類型最主要的特點是,其值不可以再分解為其它類型。也就是說,基本數據類型是自我說明的。 構造數據類型:構造數據類型是根據已定義的一個或多個數據類型用構造的方法來定義的。也就是說,一個構造類型的值可以分解成若干個“成員”或“元素”
8、。每個“成員”都是一個基本數據類型或又是一個構造類型。(2)宏定義#define 指令:預處理命令例:#define PI 3.14一旦定義,可以代替常量使用宏定義不是常量!程序中應優(yōu)先使用常量而不是宏宏定義可以防止一個頭文件被重復包含#ifndef COMDEF_H#define COMDEF_H/頭文件內容#endif(3)編譯預處理命令#include,它在編譯開始時,將另一個C源文件嵌入; #include“stdio.h” #include“string.h” #include“math.h”4)整型數據的定義及取值范圍類型 定義符 位數 數值范圍 整型 int 16位 -215(2
9、15)-1短整型 short 16位 同上長整型 long 32位 -231(231)-1無符號 unsigned 16位 0(216)-1 無符號短整型 unsigned short 16位 0(216)-1 無符號長整型 unsigned long 32位 0(232)-1 注:xy等于x的y次冪 (5)常用格式I/O函數putchar(參數)字符輸出函數 功能:向終端輸出一個字符 參數:char or int型變量函數值:輸出參數的值。getchar( )字符輸入函數 功能:從終端輸入一個字符 參數:無 函數值:從輸入設備得到的字符。printf格式輸出函數 printf(格式控制,輸出
10、表列) “格式控制”是用雙引號括起來的字符串,包括:格式說明,由%和格式字符組成; 普通字符,即需原樣輸出的字符。 “輸出表列”是要輸出的一些數據,可以是表達式如: printf(“a=%d,b=%d”,a,b); scanf格式輸入函數 scanf(格式控制,地址表列) 格式控制:用%d,%o,%x,%c,%s,%f,%e 地址表列:由若干個地址組成的表列,可以是變量的地址,或字符串的地址。如: int a,b,c; scanf(“%d%d%d”,&a,&b,&c);匯編語言的語言元素(1) 語句 等值語句EQU格式:符號 EQU 表達式表達式:常數或數值表達式、地址
11、表達式、變量或標號。等號語句 格式:符號 = 表達式數據定義語句 變量名 BYTEWORDDWORD. 表達式1,表達式2,.(2)運算符格式:<運算符> <地址表達式>運算對象是存儲器操作數,由變量名或標號組成地址表達式。SEG: 返回變量所在的段值。OFFSET: 返回變量所在偏移量。TYPE: 返回變量的類型。LENGTH: 返回數組變量的元素個數。SIZE: 返回數組變量所占的總字節(jié)數。SIZE= TYPE* LENGTHPTR:類型 PTR 地址表達式類型可以是:BYTE ,WORD,DWORD 或NEAR,FAR僅在當前語句中有效,是一種臨時設置。(3)整數
12、算術指令SHL/SHR:邏輯左右移位SAL/SAR:算術左右移位ROL/ROR:循環(huán)左右移位RCL/RCR:帶進位的循環(huán)左右移位SHLD/SHRD:雙精度左右移位無符號乘法MUL指令有符號乘法IMUL指令無符號除法DIV指令有符號除法:CBW、CWD、CDQ指令用于整數符號擴展CBW指令將AL中的符號位擴展到AH中CWD指令將AX中的符號位擴展到DX中CDQ指令將EAX中的符號位擴展到EDX中(4) 宏程序中使用宏分為定義和調用兩個部分。宏定義用來說明哪些指令或偽指令是將 在程序中重復出現的程序段;宏調用是用來告訴匯編程序,在翻譯前先把宏定義 中的程序段復制一遍。可見,宏定義和宏調用都是告訴匯
13、編程序如何處理,屬于 偽操作。 格式: 宏名 MACRO 宏體 ENDM宏調用:定義后的宏名又稱為宏指令。經宏定義后,就可以在源程序中調用宏了。 宏調用的方式是在源程序中需要復制宏體的地方寫宏的名字。宏名單獨 占一行,當源程序被匯編時,匯編程序將對宏調用進行宏體復制,并取 代宏名,這種復制操作稱為宏展開。宏的好處主要體現在每次調用而展開的宏體可以不同。這需要在宏定義時以形式 參數指明宏體中的哪些部分可以被不同的實際參數代替,每次調用時在宏名字的 后面附帶實際參數。完整的宏定義格式是: 宏名 MACRO 形式參數表 宏體 ENDM宏操作中形參與實參的對應關系: 由于宏是偽操作,形參與實參的對應方
14、法是由匯編程序決定的,與高級語言中形 參與實參的對應方式有很大的不同。匯編語言規(guī)定: (1)形參表中的多個參數項之間必須用逗號分隔,但實參表的各個參數項可以用 逗號也可以用空格分隔。 (2)如果形參的數目與實參的數目相等,則按照形參表與實參表中各參數項的次 序一一對應。 (3)如果形參數目少于實參數目,多余的實參被忽略,匯編程序不做任何提示。宏的嵌套 類似于在子程序中可以調用另一個子程序,在一個宏體中也允許再調用另一個已定義的宏。對這種宏中套宏的宏調用,匯編程序將逐次展開,直到展開后的結果不再含有宏調用為止。設某程序中已定義了3個字型變量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ī)定的格式。不同的計算機語言對子程 序格式的規(guī)定不同,匯編語言的子程序基本格式如下: 子程序名 PROC 類型 指令序列 子程序名 ENDP b)子程序相關指令 CALL指令 指令格式:CALL 子程序名 功能:這是調用子程序的指令。 RET指
16、令 功能:這是子程序返回指令,必須寫在子程序的指令序列之中。 子程序的調用與返回 在匯編語言程序中,子程序分為定義和使用兩部分。在較短的程序中,通常 把子程序與其余指令寫在同一個代碼段內,一個代碼段中可以定義多個子程 序,并且都定義成NEAR類型。這樣編寫的代碼段的基本結構如下:段名 SEGMENT 子程序1 PROC NEAR 子程序1 ENDP 子程序2 PROC NEAR 子程序2 ENDP 子程序n PROC NEAR 子程序n ENDP 入口標號: 段名 ENDS宏與子程序的比較 : 1)處理的時間不同。宏調用是在源程序被匯編時由匯編程序處理的;而子程序調 用是在程序執(zhí)行期間由CPU
17、直接執(zhí)行的。 2)目標代碼的長度不同。由于每一次宏調用都要進行宏展開,把宏體中的內容復 制一遍,因而用宏編寫的程序在目標代碼中會重復出現相同或相似的程序段, 占用內存空間大;而子程序是由CALL指令調用,無論調用多少次,子程序的 目標代碼只在最終的執(zhí)行程序中出現一次,目標代碼相對較短 3)處理的方式不同。宏必須先定義后調用,宏調用是用宏體替換宏調用偽指令, 實參代替形參,源程序被翻譯成目標代碼后宏定義隨之消失;而子程序的調用 沒有這樣的替換操作,是以CALL指令將控制權由調用者轉給子程序 4)參數處理不同。宏調用是以實參代替形參,參數的形式不受制,可以是指令助 記符、寄存器名、標號等;而子程序
18、的參數傳遞必須有確切的存放地 5)執(zhí)行速度不同。子程序調用時會比宏展開后的代碼多執(zhí)行CALL指令和RET 指令,以及需要附加的指令進行參數傳遞,因而執(zhí)行速度稍慢。 總結:編寫程序的過程中,對于程序中的重復部分,究竟是采用宏還是子程序,可以權衡 內存空間、執(zhí)行速度、參數傳遞方法等各方面的因素后取舍。在大多數情況下,宏比子程序有更大的靈活性,且執(zhí)行速度快,在重復部分較短時經常采用;而一個已經驗證過的子程序,可以做成目標代碼存放在子程序庫中,在另一個程序中應用時可不經過匯編程序的翻譯,直接與需要使用它的程序連接在一起,從而避免宏展開后可能出現的語法及邏輯錯誤。 C語言的具體實現: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 ;對全局變量賦值g = a;call 0023pop sipop bpretpush bp mov bp, sppush simov si, 0011 ;局部變量int c = 0x11;mov ds:0000, si ;對全局變量賦值a = c; m
20、ov ax, word ptr ds:0000mov word ptr ds:0002, ax ;以上兩句完成g = a的操作pop sipop bpret總結:C語言將局部變量存儲于堆棧中,在函數結束時自動清除,全局變量存儲于 定義的數據段中,在程序中全局變量定義后的函數中均可訪問。若定義了全 局變量和局部變量,在子函數中若存在與全局變量同名的局部變量,則使用 子函數中的局部變量,而不使用全局變量。 C語言指針變量作為函數參數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 ;調用函數swappop cx pop cx ;堆棧平衡pop dipop sileaveretnsub_100B3:push bpmov bp, sppush si ;變量pmov bx, bp+4 ;取得變量p1,bx中現存放的是地址mov si, bx ;取得*p1,p = *p1mov bx, bp+6 ;取得變量p2,bx中現存放的是地址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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度直播平臺虛擬禮物開發(fā)與交易服務合同范本
- 2025年度源代碼保密協(xié)議書-新能源技術研發(fā)合作專用版
- 2025年度證券投資財務規(guī)劃與咨詢協(xié)議
- 2025年度房產維修基金管理服務合同-@-1
- 2025年度廢棄塑料回收利用技術研發(fā)協(xié)議
- 預見行業(yè)變化的應對計劃
- 開展生物學科研討會的計劃
- 教學日常檢查與評估機制計劃
- 患者膳食管理經驗與總結計劃
- 協(xié)助學生進行自我評估的計劃
- 生理產科學-正常分娩期的護理(助產學課件)
- 中國商貿文化 貨幣簡史
- 高中校本課程-網絡營銷概述教學設計學情分析教材分析課后反思
- 煤場用車輛倒運煤的方案
- PPK計算模板完整版
- 胸腔閉式引流護理-中華護理學會團體標準
- 居民自建房經營業(yè)態(tài)不超過三種承諾書
- 河南省陜州區(qū)王家后鄉(xiāng)滹沱鋁土礦礦產資源開采與生態(tài)修復方案
- 2015-2022年大慶醫(yī)學高等專科學校高職單招語文/數學/英語筆試參考題庫含答案解析
- 兩篇古典英文版成語故事塞翁失馬
- 中國古代文學史 馬工程課件(中)13第五編 宋代文學 第一章 北宋初期文學
評論
0/150
提交評論