亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 匯編初學者.txt

?? 很適合匯編語言初學者的文章
?? TXT
?? 第 1 頁 / 共 2 頁
字號:

  串操作指令經常和重復前綴REP和循環指令LOOP結合使用以完成對整個字符串的操作。而REP前綴和LOOP指令都有硬件規定用ECX做循環計數器。舉例: 

  LDS ESI,SRC_STR_PTR 
  LES EDI,DST_STR_PTR 
  MOV ECX,200 
  REP MOVSD 

  上面的代碼從SRC_STR拷貝200個雙字到DST_STR. 細節是:REP前綴先檢查ECX是否為0,若否則執行一次MOVSD,ECX自動減1,然后執行第二輪檢查、執行......直到發現ECX=0便不再執行MOVSD,結束重復而執行下面的指令。 


  LDS ESI,SRC_STR_PTR 
  MOV ECX,100 
  LOOP1: 
  LODSW 
  .... (deal with value in AX) 

  LOOP LOOP1 
  ..... 

  從SRC_STR處理100個字。同樣,LOOP指令先判斷ECX是否為零,來決定是否循環。每循環一輪ECX自動減1。 

  REP和LOOP 都可以加上條件,變成REPZ/REPNZ 和 LOOPZ/LOOPNZ. 這是除了ECX外,還用檢查零標志Z. REPZ 和LOOPZ在Z為1時繼續循環,否則退出循環,即使ECX不為0。REPNZ/LOOPNZ則相反。 

  ====================================================
教程: 匯編語言的準備知識-給初次接觸匯編者4

  高級語言程序的匯編解析 

  在高級語言中,如C和PASCAL等等,我們不再直接對硬件資源進行操作,而是面向于問題的解決,這主要體現在數據抽象化和程序的結構化。例如我們用變量名來存取數據,而不再關心這個數據究竟在內存的什么地方。這樣,對硬件資源的使用方式完全交給了編譯器去處理。不過,一些基本的規則還是存在的,而且大多數編譯器都遵循一些規范,這使得我們在閱讀反匯編代碼的時候日子好過一點。這里主要講講匯編代碼中一些和高級語言對應的地方。 

  1. 普通變量。通常聲明的變量是存放在內存中的。編譯器把變量名和一個內存地址聯系起來(這里要注意的是,所謂的“確定的地址”是對編譯器而言在編譯階段算出的一個臨時的地址。在連接成可執行文件并加載到內存中執行的時候要進行重定位等一系列調整,才生成一個實時的內存地址,不過這并不影響程序的邏輯,所以先不必太在意這些細節,只要知道所有的函數名字和變量名字都對應一個內存的地址就行了),所以變量名在匯編代碼中就表現為一個有效地址,就是放在方括號中的操作數。例如,在C文件中聲明: 

  int my_age; 

  這個整型的變量就存在一個特定的內存位置。語句 my_age= 32; 在反匯編代碼中可能表現為: 

  mov word ptr [007E85DA], 20 

  所以在方括號中的有效地址對應的是變量名。又如: 

  char my_name[11] = "lianzi2000"; 

  這樣的說明也確定了一個地址,對應于my_name. 假設地址是007E85DC,則內存中[007E85DC]='l',[007E85DD]='i', etc. 對my_name的訪問也就是對這地址處的數據訪問。 

  指針變量其本身也同樣對應一個地址,因為它本身也是一個變量。如: 

  char *your_name; 

  這時也確定變量"your_name"對應一個內存地址,假設為007E85F0. 語句your_name=my_name;很可能表現為: 

  mov [007E85F0], 007E85DC ;your_name的內容是my_name的地址。 

  2. 寄存器變量 

  在C和C 中允許說明寄存器變量。register int i; 指明i是寄存器存放的整型變量。通常,編譯器都把寄存器變量放在esi和edi中。寄存器是在cpu內部的結構,對它的訪問要比內存快得多,所以把頻繁使用的變量放在寄存器中可以提高程序執行速度。 

  3. 數組 

  不管是多少維的數組,在內存中總是把所有的元素都連續存放,所以在內存中總是一維的。例如,int i_array[2][3]; 在內存確定了一個地址,從該地址開始的12個字節用來存貯該數組的元素。所以變量名i_array對應著該數組的起始地址,也即是指向數組的第一個元素。存放的順序一般是i_array[0][0],[0][1],[0][2],[1][0],[1][1],[1][2] 即最右邊的下標變化最快。當需要訪問某個元素時,程序就會從多維索引值換算成一維索引,如訪問i_array[1][1],換算成內存中的一維索引值就是1*3 1=4.這種換算可能在編譯的時候就可以確定,也可能要到運行時才可以確定。無論如何,如果我們把i_array對應的地址裝入一個通用寄存器作為基址,則對數組元素的訪問就是一個計算有效地址的問題: 

  ; i_array[1][1]=0x16 

  lea ebx,xxxxxxxx ;i_array 對應的地址裝入ebx 
  mov edx,04 ;訪問i_array[1][1],編譯時就已經確定 
  mov word ptr [ebx edx*2], 16 ; 

  當然,取決于不同的編譯器和程序上下文,具體實現可能不同,但這種基本的形式是確定的。從這里也可以看到比例因子的作用(還記得比例因子的取值為1,2,4或8嗎?),因為在目前的系統中簡單變量總是占據1,2,4或者8個字節的長度,所以比例因子的存在為在內存中的查表操作提供了極大方便。 

  4. 結構和對象 

  結構和對象的成員在內存中也都連續存放,但有時為了在字邊界或雙字邊界對齊,可能有些微調整,所以要確定對象的大小應該用sizeof操作符而不應該把成員的大小相加來計算。當我們聲明一個結構變量或初始化一個對象時,這個結構變量和對象的名字也對應一個內存地址。舉例說明: 

  struct tag_info_struct 
  { 
  int age; 
  int sex; 
  float height; 
  float weight; 
  } marry; 

  變量marry就對應一個內存地址。在這個地址開始,有足夠多的字節(sizeof(marry))容納所有的成員。每一個成員則對應一個相對于這個地址的偏移量。這里假設此結構中所有的成員都連續存放,則age的相對地址為0,sex為2, height 為4,weight為8。 

  ; marry.sex=0; 

  lea ebx,xxxxxxxx ;marry 對應的內存地址 
  mov word ptr [ebx 2], 0 
  ...... 

  對象的情況基本相同。注意成員函數具體的實現在代碼段中,在對象中存放的是一個指向該函數的指針。 


  5. 函數調用 

  一個函數在被定義時,也確定一個內存地址對應于函數名字。如: 

  long comb(int m, int n) 
  { 
  long temp; 
  ..... 

  return temp; 
  } 

  這樣,函數comb就對應一個內存地址。對它的調用表現為: 

  CALL xxxxxxxx ;comb對應的地址。這個函數需要兩個整型參數,就通過堆棧來傳遞: 

  ;lresult=comb(2,3); 

  push 3 
  push 2 
  call xxxxxxxx 
  mov dword ptr [yyyyyyyy], eax ;yyyyyyyy是長整型變量lresult的地址 

  這里請注意兩點。第一,在C語言中,參數的壓棧順序是和參數順序相反的,即后面的參數先壓棧,所以先執行push 3. 第二,在我們討論的32位系統中,如果不指明參數類型,缺省的情況就是壓入32位雙字。因此,兩個push指令總共壓入了兩個雙字,即8個字節的數據。然后執行call指令。call 指令又把返回地址,即下一條指令(mov dword ptr....)的32位地址壓入,然后跳轉到xxxxxxxx去執行。 

  在comb子程序入口處(xxxxxxxx),堆棧的狀態是這樣的: 

  03000000 (請回憶small endian 格式) 
  02000000 
  yyyyyyyy <--ESP 指向返回地址 

  前面講過,子程序的標準起始代碼是這樣的: 

  push ebp ;保存原先的ebp 
  mov ebp, esp;建立框架指針 
  sub esp, XXX;給臨時變量預留空間 
  ..... 

  執行push ebp之后,堆棧如下: 

  03000000 
  02000000 
  yyyyyyyy 
  old ebp <---- esp 指向原來的ebp 

  執行mov ebp,esp之后,ebp 和esp 都指向原來的ebp. 然后sub esp, xxx 給臨時變量留空間。這里,只有一個臨時變量temp,是一個長整數,需要4個字節,所以xxx=4。這樣就建立了這個子程序的框架: 

  03000000 
  02000000 
  yyyyyyyy 
  old ebp <---- 當前ebp指向這里 
  temp 

  所以子程序可以用[ebp 8]取得第一參數(m),用[ebp C]來取得第二參數(n),以此類推。臨時變量則都在ebp下面,如這里的temp就對應于[ebp-4]. 

  子程序執行到最后,要返回temp的值: 

  mov eax,[ebp-04] 
  然后執行相反的操作以撤銷框架: 

  mov esp,ebp ;這時esp 和ebp都指向old ebp,臨時變量已經被撤銷 
  pop ebp ;撤銷框架指針,恢復原ebp. 

  這是esp指向返回地址。緊接的retn指令返回主程序: 

  retn 4 

  該指令從堆棧彈出返回地址裝入EIP,從而返回到主程序去執行call后面的指令。同時調整esp(esp=esp 4*2),從而撤銷參數,使堆棧恢復到調用子程序以前的狀態,這就是堆棧的平衡。調用子程序前后總是應該維持堆棧的平衡。從這里也可以看到,臨時變量temp已經隨著子程序的返回而消失,所以試圖返回一個指向臨時變量的指針是非法的。 

  為了更好地支持高級語言,INTEL還提供了指令Enter 和Leave 來自動完成框架的建立和撤銷。Enter 接受兩個操作數,第一個指明給臨時變量預留的字節數,第二個是子程序嵌套調用層數,一般都為0。enter xxx,0 相當于: 

  push ebp 
  mov ebp,esp 
  sub esp,xxx 

  leave 則相當于: 

  mov esp,ebp 
  pop ebp 

  ============================================================= 
  好啦,我的學習心得講完了,謝謝各位的抬舉。教程是不敢當的,因為我也是個大菜鳥。如果這些東東能使你們的學習輕松一些,進步快一些,本菜鳥就很開心了。 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
www.66久久| 欧美日本国产视频| 欧美专区日韩专区| 久久婷婷国产综合精品青草 | 欧美日韩视频在线第一区| 日韩欧美国产一区在线观看| 亚洲欧洲成人av每日更新| 日韩不卡一区二区| 97久久超碰国产精品| xfplay精品久久| 视频一区二区不卡| 色综合天天天天做夜夜夜夜做| 91精品国产综合久久福利软件| 国产精品国产精品国产专区不片| 蜜桃免费网站一区二区三区| 97se狠狠狠综合亚洲狠狠| 亚洲精品一区二区三区影院| 天堂蜜桃91精品| 在线视频你懂得一区二区三区| 国产亚洲精品7777| 看片网站欧美日韩| 欧美日韩二区三区| 一区二区三区四区不卡视频 | 免费成人av在线播放| 91小视频免费看| 中文字幕亚洲欧美在线不卡| 国产乱国产乱300精品| 制服丝袜亚洲播放| 亚洲成人免费在线观看| 91麻豆高清视频| 亚洲免费看黄网站| 91丨porny丨蝌蚪视频| 中文字幕一区二区三区四区| 懂色av噜噜一区二区三区av| 日本一区二区视频在线| 福利一区福利二区| 中文字幕不卡一区| 99久久国产综合精品色伊| 国产精品久久久久久久久动漫| 国产精品中文有码| 国产精品久线在线观看| 97se亚洲国产综合在线| 亚洲国产综合人成综合网站| 欧美无人高清视频在线观看| 亚洲a一区二区| 欧美一区二区免费观在线| 热久久免费视频| 久久影音资源网| 粉嫩高潮美女一区二区三区| 亚洲丝袜制服诱惑| 欧美性猛交xxxxxx富婆| 日本aⅴ免费视频一区二区三区| 日韩欧美一级特黄在线播放| 国产一区在线视频| 亚洲视频免费在线观看| 欧美日韩五月天| 韩国欧美一区二区| 成人免费一区二区三区视频| 欧美性大战久久| 捆绑调教美女网站视频一区| 国产精品美女www爽爽爽| 色综合 综合色| 麻豆成人91精品二区三区| 久久久99精品久久| 欧美性色aⅴ视频一区日韩精品| 麻豆国产欧美一区二区三区| 国产精品美女www爽爽爽| 欧美久久婷婷综合色| 国产一区二区三区四| 亚洲男人的天堂网| 日韩一区二区影院| 不卡欧美aaaaa| 婷婷综合五月天| 欧美激情一区二区三区在线| 欧美三日本三级三级在线播放| 美女视频黄a大片欧美| 中文字幕欧美三区| 欧美另类久久久品| 不卡的av网站| 日本在线播放一区二区三区| 国产精品美日韩| 日韩视频免费直播| 色呦呦日韩精品| 国产在线精品一区二区夜色| 一区二区在线观看av| 久久日韩粉嫩一区二区三区| 在线观看网站黄不卡| 国产91在线看| 美女视频黄a大片欧美| 亚洲一区二区三区激情| 日本一区二区视频在线观看| 欧美一区二区三区婷婷月色| 91亚洲精品一区二区乱码| 久久99最新地址| 丝袜亚洲另类欧美综合| 亚洲柠檬福利资源导航| 国产精品丝袜黑色高跟| 精品蜜桃在线看| 欧美一区二区视频在线观看2020 | 国产aⅴ精品一区二区三区色成熟| 亚洲国产精品久久人人爱| 国产欧美视频一区二区| 日韩精品一区二区三区中文不卡| 欧美日韩一区三区四区| 91麻豆自制传媒国产之光| 成人免费视频视频在线观看免费| 美国av一区二区| 日韩电影在线一区二区| 图片区小说区国产精品视频| 亚洲夂夂婷婷色拍ww47| 亚洲免费高清视频在线| 中文字幕亚洲在| 18成人在线观看| 国产精品午夜免费| 国产精品热久久久久夜色精品三区 | 日韩精品成人一区二区在线| 一区二区三区欧美| 一区二区三区高清| 亚洲综合精品自拍| 日韩精品一区第一页| 亚洲一区在线观看免费观看电影高清 | www一区二区| 日本一区二区三区视频视频| 日本一区二区成人| 亚洲精品网站在线观看| 一区二区在线观看免费| 亚洲mv在线观看| 日韩av一二三| 国产黄色精品网站| 成人午夜视频福利| 色综合天天性综合| 欧美电影一区二区三区| 这里只有精品视频在线观看| 日韩免费电影网站| 国产日韩欧美精品综合| 亚洲图片激情小说| 午夜精品福利视频网站| 久久精品国产在热久久| 粉嫩高潮美女一区二区三区| 色天天综合色天天久久| 欧美一卡二卡在线| 久久精品视频网| 一区二区三区资源| 美女尤物国产一区| 成人国产精品视频| 欧美日韩成人在线| 久久久一区二区| 亚洲国产欧美在线| 国内精品伊人久久久久av一坑| 成人h动漫精品一区二区| 欧洲亚洲国产日韩| 精品福利视频一区二区三区| 国产精品国产三级国产三级人妇| 亚洲.国产.中文慕字在线| 激情欧美日韩一区二区| 色香蕉久久蜜桃| www久久久久| 亚洲高清三级视频| 成人性视频网站| 日韩一区二区电影在线| 亚洲欧美中日韩| 蜜臀a∨国产成人精品| www.欧美.com| 精品少妇一区二区三区视频免付费| 国产精品成人免费精品自在线观看| 亚洲第一福利视频在线| 高潮精品一区videoshd| 欧美一个色资源| 一区二区三区成人| 成人av在线电影| xfplay精品久久| 首页国产欧美日韩丝袜| 不卡视频免费播放| 久久综合久久综合久久综合| 日韩国产欧美在线播放| 99精品黄色片免费大全| 久久久久久久久久久99999| 日韩电影在线看| 91久久精品一区二区| 国产视频一区在线播放| 蜜桃视频免费观看一区| 欧美军同video69gay| 夜夜爽夜夜爽精品视频| 99视频一区二区三区| 久久久久9999亚洲精品| 久久国产福利国产秒拍| 91麻豆精品国产91久久久久久| 最新欧美精品一区二区三区| 成人综合婷婷国产精品久久免费| 精品精品国产高清a毛片牛牛| 三级亚洲高清视频| 欧美色老头old∨ideo| 亚洲电影一区二区三区| 欧美性猛交xxxx乱大交退制版| 亚洲精品国产一区二区精华液| 成人免费毛片高清视频| 国产日韩三级在线| 国产99久久久久久免费看农村| 久久久蜜桃精品| 国产+成+人+亚洲欧洲自线|