青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 47, 文章 - 10, 評論 - 8, 引用 - 0
數據加載中……

簡明x86匯編語言教程(五)

原創:司徒彥南

3.4 串操作

我們前面已經提到,內存可以和寄存器交換數據,也可以被賦予立即數。問題是,如果我們需要把內存的某部分內容復制到另一個地址,又怎么做呢?

設想將DS:SI處的連續512字節內容復制到ES:DI(先不考慮可能的重疊)。也許會有人寫出這樣的代碼:


NextByte:
mov cx,512
mov al,ds:[si]
mov es:[di],al
inc si
inc di
loop NextByte
; 循環次數

我不喜歡上面的代碼。它的確能達到作用,但是,效率不好。如果你是在做優化,那么寫出這樣的代碼意味著賠了夫人又折兵。

Intel的CPU的強項是串操作。所謂串操作就是由CPU去完成某一數量的、重復的內存操作。需要說明的是,我們常用的KMP算法(用于匹配字符串中的模式)的改進——Boyer算法,由于沒有利用串操作,因此在Intel的CPU上的效率并非最優。好的編譯器往往可以利用Intel CPU的這一特性優化代碼,然而,并非所有的時候它都能產生最好的代碼。

某些指令可以加上REP前綴(repeat, 反復之意),這些指令通常被叫做串操作指令。

舉例來說,STOSD指令將EAX的內容保存到ES:DI,同時在DI上加或減四。類似的,STOSB和STOSW分別作1字節或1字的上述操作,在DI上加或減的數是1或2。

計算機語言通常是不允許二義性的。為什么我要說“加或減”呢?沒錯,孤立地看STOS?指令,并不能知道到底是加還是減,因為這取決于“方向”標志(DF, Direction Flag)。如果DF被復位,則加;反之則減。

置位、復位的指令分別是STD和CLD。

當然,REP只是幾種可用前綴之一。常用的還包括REPNE,這個前綴通常被用來比較兩個串,或搜索某個特定字符(字、雙字)。REPZ、REPE、REPNZ也是非常常用的指令前綴,分別代表ZF(Zero Flag)在不同狀態時重復執行。

下面說三個可以復制數據的指令:

助記符意義
movsb將DS:SI的一字節復制到ES:DI,之后SI++、DI++
movsw將DS:SI的一字節復制到ES:DI,之后SI+=2、DI+=2
movsd將DS:SI的一字節復制到ES:DI,之后SI+=4、DI+=4

于是上面的程序改寫為

cld
mov cx, 128
rep movsd
; 復位DF
; 512/4 = 128,共128個雙字
; 行動!

第一句cld很多時候是多余的,因為實際寫程序時,很少會出現置DF的情況。不過在正式決定刪掉它之前,建議你仔細地調試自己的程序,并確認每一個能夠走到這里的路徑中都不會將DF置位。

錯誤(非預期的)的DF是危險的。它很可能斷送掉你的程序,因為這直接造成緩沖區溢出問題。

什么是緩沖區溢出呢?緩沖區溢出分為兩類,一類是寫入緩沖區以外的內容,一類是讀取緩沖區以外的內容。后一種往往更隱蔽,但隨便哪一個都有可能斷送掉你的程序。

緩沖區溢出對于一個網絡服務來說很可能更加危險。懷有惡意的用戶能夠利用它執行自己希望的指令。服務通常擁有更高的特權,而這很可能會造成特權提升;即使不能提升攻擊者擁有的特權,他也可以利用這種問題使服務崩潰,從而形成一次成功的DoS(拒絕服務)攻擊。每年CERT的安全公告中,都有6成左右的問題是由于緩沖區溢出造成的。

在使用匯編語言,或C語言編寫程序時,很容易在無意中引入緩沖區溢出。然而并不是所有的語言都會引入緩沖區溢出問題,Java和C#,由于沒有指針,并且緩沖區采取動態分配的方式,有效地消除了造成緩沖區溢出的土壤。

匯編語言中,由于REP*前綴都用CX作為計數器,因此情況會好一些(當然,有時也會更糟糕,因為由于CX的限制,很可能使原本可能改變程序行為的緩沖區溢出的范圍縮小,從而更為隱蔽)。避免緩沖區溢出的一個主要方法就是仔細檢查,這包括兩方面:設置合理的緩沖區大小,和根據大小編寫程序。除此之外,非常重要的一點就是,在匯編語言這個級別寫程序,你肯定希望去掉所有的無用指令,然而再去掉之前,一定要進行嚴格的測試;更進一步,如果能加上注釋,并通過善用宏來做調試模式檢查,往往能夠達到更好的效果。

3.5 關于保護模式中內存操作的一點說明

正如3.2節提到到的那樣,保護模式中,你可以使用32位的線性地址,這意味著直接訪問4GB的內存。由于這個原因,選擇器不用像實模式中段寄存器那樣頻繁地修改。順便提一句,這份教程中所說的保護模式指的是386以上的保護模式,或者,Microsoft通常稱為“增強模式”的那種。

在為選擇器裝入數值的時候一定要非常小心。錯誤的數值往往會導致無效頁面錯誤(在Windows中經常出現:)。同時,也不要忘記你的地址是32位的,這也是保護模式的主要優勢之一。

現在假設存在一個描述符描述從物理的0:0開始的全部內存,并已經加載進DS(數據選擇器),則我們可以通過下面的程序來操作VGA的VRAM:

mov edi,0a0000h
mov byte ptr [edi],0fh
; VGA顯存的偏移量
; 將第一字節改為0fh

很明顯,這比實模式下的程序

mov ax,0a000h
mov ds,ax
mov di,0
mov [di],0fh
; AX -> VGA段地址
; 將AX值載入DS
; DI清零
; 修改第一字節

看上去要舒服一些。

3.6 堆棧

到目前為止,您已經了解了基本的寄存器以及內存的操作知識。事實上,您現在已經可以寫出很多的底層數據處理程序了。

下面我來說說堆棧。堆棧實在不是一個讓人陌生的數據結構,它是一個先進后出(FILO)先進后出(FILO)是這樣一個概念:最后放進表中的數據在取出時最先出來。先進后出(FILO)和先進先出(FIFO, 和先進后出的規則相反),以及隨機存取是最主要的三種存儲器訪問方式。對于堆棧而言,最后放入的數據在取出時最先出現。對于子程序調用,特別是遞歸調用來說,這是一個非常有用的特性。)的線性表,能夠幫助你完成很多很好的工作。

一個鐵桿的匯編語言程序員有時會發現系統提供的寄存器不夠。很顯然,你可以使用普通的內存操作來完成這個工作,就像C/C++中所做的那樣。

沒錯,沒錯,可是,如果數據段(數據選擇器)以及偏移量發生變化怎么辦?更進一步,如果希望保存某些在這種操作中可能受到影響的寄存器的時候怎么辦?確實,你可以把他們也存到自己的那片內存中,自己實現堆棧。

太麻煩了……

既然系統提供了堆棧,并且性能比自己寫一份更好,那么為什么不直接加以利用呢?

系統堆棧不僅僅是一段內存。由于CPU對它實施管理,因此你不需要考慮堆棧指針的修正問題。可以把寄存器內容,甚至一個立即數直接放到堆棧里,并在需要的時候將其取出。同時,系統并不要求取出的數據仍然回到原來的位置。

除了顯式地操作堆棧(使用PUSH和POP指令)之外,很多指令也需要使用堆棧,如INT、CALL、LEAVE、RET、RETF、IRET等等。配對使用上述指令并不會造成什么問題,然而,如果你打算使用LEAVE、RET、RETF、IRET這樣的指令實現跳轉(比JMP更為麻煩,然而有時,例如在加密軟件中,或者需要修改調用者狀態時,這是必要的)的話,那么我的建議是,先搞清楚它們做的到底是什么,并且,精確地了解自己要做什么。

正如前面所說的,有兩個顯式地操作堆棧的指令:

助記符

功能

PUSH將操作數存入堆棧,同時修正堆棧指針
POP將棧頂內容取出并存到目的操作數中,同時修正堆棧指針

我們現在來看看堆棧的操作。

執行之前

o_5_1.gif

執行代碼

mov ax,1234h
mov bx,10
push ax
push bx

之后,堆棧的狀態為

o_5_2.gif

之后,再執行

pop dx
pop cx

堆棧的狀態成為

o_5_3.gif

當然,dx、cx中的內容將分別是000ah和1234h。

注意,最后這張圖中,我沒有抹去1234h和000ah,因為POP指令并不從內存中抹去數值。不過盡管如此,我個人仍然非常反對繼續使用這兩個數(你可以通過修改SP來再次POP它們),然而這很容易導致錯誤。

一定要保證堆棧段有足夠的空間來執行中斷,以及其他一些隱式的堆棧操作。僅僅統計PUSH的數量并據此計算堆棧所需的大小很可能造成問題。

CALL指令將返回地址放到堆棧中。絕大多數C/C++編譯器提供了“堆棧檢查”這個編譯選項,其作用在于保證C程序段中沒有忘記對堆棧中多余的數據進行清理,從而保證返回地址有效。

本章小結

本章中介紹了內存的操作的一些入門知識。限于篇幅,我不打算展開細講指令,如cmps*,lods*,stos*,等等。這些指令的用法和前面介紹的movs*基本一樣,只是有不同的作用而已。

posted on 2006-11-06 10:33 編程之道 閱讀(384) 評論(0)  編輯 收藏 引用 所屬分類: 開發相關ASM

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久综合久色欧美综合狠狠| 久久久久91| 91久久国产综合久久91精品网站| 亚洲一级免费视频| 亚洲国产一区视频| 久久久久欧美精品| 国产一区再线| 久久av老司机精品网站导航| 一区二区久久久久| 欧美视频一区二区| 亚洲一区二区欧美| 一级成人国产| 国产精品免费一区豆花| 先锋影音国产精品| 午夜亚洲伦理| 狠狠网亚洲精品| 榴莲视频成人在线观看| 久久视频精品在线| 亚洲片区在线| 99re热精品| 亚洲精品123区| 欧美日本国产| 欧美日韩一区二区欧美激情| 亚洲精品美女在线观看播放| 亚洲高清视频的网址| 欧美jizz19性欧美| 亚洲免费成人av电影| 亚洲精品永久免费| 国产精品久久久免费| 久久激情网站| 米奇777超碰欧美日韩亚洲| 亚洲欧洲日产国码二区| 亚洲精品国偷自产在线99热| 欧美日韩综合| 久久精品国产久精国产爱| 久久久久久久一区| 日韩手机在线导航| 亚洲一区二区三区国产| 国产日韩欧美在线看| 麻豆精品精华液| 欧美另类综合| 久久精品国产清高在天天线| 蜜臀99久久精品久久久久久软件| 亚洲免费观看| 亚洲一区在线免费| 亚洲国产精品一区二区尤物区| 亚洲人妖在线| 国产一区二区三区黄视频| 欧美韩日视频| 国产乱码精品一区二区三| 欧美aⅴ一区二区三区视频| 欧美日韩在线观看一区二区| 久久精品免费播放| 欧美精品一区二| 久久九九免费| 欧美性开放视频| 欧美大尺度在线观看| 亚洲精品久久久久中文字幕欢迎你| 欧美网站在线| 亚洲欧洲另类| 尤物九九久久国产精品的分类| 99热这里只有成人精品国产| 一区二区亚洲精品| 亚洲一区二区精品在线观看| 亚洲精品影视| 久久精品亚洲一区二区| 亚洲一区二区在线视频| 免费在线国产精品| 久久综合一区| 国产亚洲亚洲| 亚洲欧美色一区| 亚洲一区二区三区视频| 欧美成人精品激情在线观看| 久久久久国产精品一区三寸| 欧美日韩ab片| 亚洲黄色尤物视频| 亚洲国内在线| 久久综合狠狠综合久久综青草 | 99热这里只有成人精品国产| 久久精品青青大伊人av| 欧美一区1区三区3区公司| 欧美乱大交xxxxx| 欧美激情亚洲一区| 亚洲国产91| 久久亚洲国产精品日日av夜夜| 久久精品国产一区二区三区免费看 | 国产精品久久久久久久久免费樱桃 | 国产一区二区日韩| 亚洲欧美日韩精品久久亚洲区| 中日韩美女免费视频网址在线观看| 另类欧美日韩国产在线| 美女诱惑黄网站一区| 樱花yy私人影院亚洲| 久久精品午夜| 欧美国产成人精品| 亚洲精品乱码| 欧美日韩成人综合在线一区二区| 亚洲国产黄色片| 99国产精品久久久久老师| 免费观看成人鲁鲁鲁鲁鲁视频 | 欧美日本韩国一区| 日韩视频一区二区| 欧美精品999| 亚洲精品久久久久久下一站| 在线视频欧美日韩精品| 欧美深夜影院| 亚洲欧美日韩在线播放| 久久久噜噜噜久久| 在线观看亚洲视频| 欧美大片在线观看一区| 亚洲人成网站777色婷婷| 一区二区三区不卡视频在线观看| 欧美性色综合| 午夜日韩福利| 美女脱光内衣内裤视频久久影院 | 亚洲欧美日韩在线一区| 久久久久久久久久久久久女国产乱 | 噜噜噜躁狠狠躁狠狠精品视频| 精品成人一区二区三区四区| 欧美a级在线| 国产精品99久久99久久久二8| 欧美一级专区| 最新日韩中文字幕| 欧美视频一区二区三区四区| 欧美在线视频一区二区三区| 亚洲国产高清一区| 性色av一区二区三区在线观看| 黄色日韩网站| 欧美日韩综合另类| 久久一区二区三区四区| 亚洲精品日韩综合观看成人91| 校园春色国产精品| 亚洲精品久久7777| 国产欧美大片| 欧美国产亚洲视频| 香蕉久久a毛片| 日韩香蕉视频| 亚洲伦伦在线| 国产精品日韩欧美综合| 欧美chengren| 欧美一区激情| 艳女tv在线观看国产一区| 国产精品日日做人人爱| 免费日韩成人| 久久国产精品99国产| 一本久道久久综合狠狠爱| 久久综合久久久久88| 亚洲一级高清| 日韩亚洲精品电影| 在线欧美一区| 黄色成人av在线| 国产精品九九| 欧美精品电影在线| 蜜桃av一区| 久久久久青草大香线综合精品| 亚洲图片激情小说| 亚洲人体一区| 91久久夜色精品国产九色| 麻豆久久精品| 久久精品视频在线播放| 亚洲欧美在线免费观看| 99热在这里有精品免费| 亚洲激情视频网| 亚洲电影网站| 亚洲国产日韩一级| 在线精品视频一区二区三四| 国产日韩欧美一二三区| 国产精品一区二区男女羞羞无遮挡 | 亚洲一区二区综合| 日韩视频不卡| 日韩亚洲欧美中文三级| 亚洲黄色av一区| 91久久在线| 日韩午夜av电影| 99re6这里只有精品| 亚洲三级电影全部在线观看高清| 欧美激情麻豆| 亚洲欧洲日韩女同| 亚洲精品中文字幕有码专区| 最新国产成人在线观看| 亚洲精品一区二区三区蜜桃久 | 亚洲人成久久| 亚洲美女黄色| 亚洲小视频在线观看| 一本色道**综合亚洲精品蜜桃冫 | 欧美连裤袜在线视频| 欧美经典一区二区| 欧美三区在线观看| 国产精品美女久久久久av超清 | 一本色道久久综合亚洲精品按摩 | 性色一区二区| 久久嫩草精品久久久精品一| 久久久久久久一区| 免费av成人在线| 亚洲黄色影片| 在线视频中文亚洲| 午夜一区在线| 蜜桃久久av| 国产精品扒开腿做爽爽爽视频| 国产精品亚洲一区二区三区在线|