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

luqingfei@C++

為中華之崛起而崛起!
兼聽則明,偏聽則暗。

匯編語言--call和ret指令

 

callret指令

callret指令都是轉移指令,它們都修改IP,或同時修改CSIP。

它們經常被共同用來實現子程序的設計。

 

retretf

ret指令用棧中的數據,修改IP的內容,從而實現近轉移;

retf指令用棧中的數據,修改CSIP的內容,從而實現遠轉移。

CPU執行ret指令時,進行下面的兩步操作:

1(IP) = ((ss)*16 +(sp))

2(sp) = (sp)+2

CPU執行retf指令時,進行下面四步操作:

1(IP) = ((ss)*16) + (sp)

2(sp) = (sp) + 2

3(CS) = ((ss)*16) + (sp)

4(sp) = (sp) + 2


用匯編語法來解釋retretf指令,則:

CPU執行ret指令時,相當于進行:

pop IP

 

CPU執行retf指令時,相當于進行:

pop IP

pop CS

 

 

 

call指令

CPU執行call指令時,進行兩步操作:

(1)       將當前的IPCSIP壓入棧中;

(2)       轉移。

 

call指令不能實現短轉移,除此之外,call指令實現轉移的方法和jmp指令的原理相同。

 

 

依據位移進行轉移的call指令

call 標號(將當前的IP壓棧后,轉到標號處執行指令)

CPU執行此種格式的call指令時,進行如下的操作:

1(sp) = (sp)-2

     ((ss)*16 +(sp)) = (IP)

2(IP) = (IP)+16位位移。

16位位移=“標號”處的地址-call指令后的第一個字節的地址;

16位位移的范圍為-32768~32767,用補碼表示;

16位位移由編譯程序在編譯時算出。

 

用匯編語法來解釋此種格式的call指令,則:

CPU執行指令“call 標號”時,相當于進行:

push IP

jmp near ptr 標號

 

 

 

轉移的目的地址在指令中的call指令

前面講的call指令,其對應的機器指令中并沒有轉移的目的地址,而是相對于當前IP的轉移位移。

 

指令“call far ptr 標號”實現的是段間轉移。

CPU執行此格式的call指令時,進行如下的操作:

1(sp)=(sp)-2

        ((ss)*16+(sp)) = (CS)

        (sp)=(sp)-2

      ((ss)*16+(sp)) = (IP)

2(CS)=標號所在段的段地址

     (IP)=標號在段中的偏移地址

 

用匯編語法來解釋此種格式的call指令,則:

CPU執行指令“call far ptr 標號”時,相當于進行:

push CS

push IP

jmp far ptr 標號

 

 

 

轉移地址在寄存器中的call指令

指令格式:call 16位寄存器

功能:

(sp) = (sp)-2

((ss)*16+(sp)) = (IP)

(IP) = (16位寄存器)

 

用匯編語法來解釋此種格式的call指令,CPU執行call 16reg時,相當于進行:

push IP

jum 16位寄存器

 

 

 

轉移地址在內存中的call指令

有兩種格式:

1) call word ptr 內存單元地址

相當于:

push IP

jum word ptr 內存單元地址

2) call dword ptr 內存單元地址

相當于:

push CS

push IP

jmp dword ptr 內存單元地址

 

 

callret的配合使用

如何將它們配合使用來實現子程序的機制。

子程序的框架如下:

標號:

              指令

              ret

 

具有子程序的源程序的框架如下:

assume cs:code

code segment

       main: …                              ;主程序

               …

               call sub1                     ;調用子程序sub1

               …

               mov ax,4c00h

               int 21h

       sub1: ….                             ;子程序sub1開始

               …

               call sub2                     ;調用子程序sub2

               …

               ret                              ;子程序返回

       sub2: ….                             ;子程序sub2開始

               …

               ret                              ;子程序返回

code ends

end maint

 

 

 

 

mul指令

mul是乘法指令。

使用mul做乘法的時候:

1) 兩個相乘的數:兩個相乘的數,要么都是8位,要么都是16位。

如果是8位,一個默認放在AL中,別一個放在8位寄存器或內存單元中;

如果是16位,一個默認在AX中,另一個放在16位寄存器或內存單元中。

2) 結果:如果是8位乘法,結果默認放在AX中;如果是16位乘法,結果高位默認在DX中存放,低位在AX中存放。

 

格式如下:

mul reg

mul 內存單元

 

 

 

模塊化程序設計

callret指令共同支持了匯編語言編程中的模塊化設計。

在實際編程中,程序的模塊化是必不可少的。

因為實現的問題比較復雜,對現實問題進行分析時,把它轉化成為相互聯系、不同層次的子問題,是必須的解決方法。

callret指令對這種分析方法提供了程序實現上的支持。

利用callret指令,我們可以用簡捷的方法,實現多個相互聯系、功能獨立的子程序來解決一個復雜的問題。

 

 

 

參數和結果傳遞的問題

子程序一般都要根據提供的參數處理一定的事務,處理后,將結果(返回值)提供給調用者。

其實,我們討論參數和返回值傳遞的問題,實際上就是在探討,應該如何存儲子程序需要的參數和產生的返回值。

 

;說明:計算N3次方

;參數:(bx)=N

;結果:(dx:ax)=N^3

cube:mov ax,bx

       mul bx

       mul bx

       ret

注意,編程時的良好風格,應有有詳細的注釋。包含對子程序的功能、參數和結果的說明。

 

用寄存器來存儲參數和結果是最常使用的方法。對于存放參數的寄存器和存放結果的寄存器,調用者和子程序的讀寫操作恰恰相反:調用者將參數送入參數寄存器,從結果寄存器中取到返回值;子程序從參數寄存器中取到參數,將返回值送入結果寄存器。

 

 

 

批量數據的傳遞

寄存器的數量終究有限,我們不可能簡單地用寄存器來存放多個需要傳遞的數據。對于返回值,也有同樣的問題。

 

在這種時候,我們將批量數據放到內存中,然后將它們所在內存空間的首地址放在寄存器中,傳遞給需要的子程序。對于具有批量數據的返回結果,也可用同樣的方法。

 

除了用寄存器傳遞參數外,還有一種通用的方法是用棧來傳遞參數。

 

 

寄存器沖突的問題

一個一般化的問題,子程序中使用的寄存器,很可能在主程序中也要使用,造成了寄存器使用上的沖突。

那么我們如何來避免這種沖突呢?粗略地看,可以有兩個方案:

1) 在編寫調用子程序的程序時,注意看看子程序中有沒有用到會產生沖突的寄存器,如果有,調用者使用別的寄存器;

2) 在編寫子程序的時候,不要使用會產生沖突的寄存器。

以上兩個方案,不具可行性,第一種給調用子程序的程序的編寫造成很大麻煩。第二種不可能實現,子程序無法知道將來的調用情況。

 

我們希望:

1) 編寫調用子程序的程序的時候不必關心子程序到底使用了哪些寄存器;

2) 編寫子程序的時候不必關心調用者使用了哪些寄存器;

3) 不會發生寄存器沖突。

 

解決這個問題的簡捷方法是,在子程序的開始將子程序中所有用到的寄存器中的內容都保存起來,在子程序返回前再恢復。我們可以用棧來保存寄存器中的內容。

 

以后,我們編寫子程序的標準框架如下:

子程序開始:子程序中使用的寄存器入棧

                     子程序內容

                     子程序中使用的寄存器出棧

                     返回(ret、retf

 

要注意寄存器入棧和出棧的順序。

 

 

實驗10 編寫子程序

1、 顯示字符串

問題:顯示字符串是現實工作中經常要用到的功能,應該編寫一個通用的子程序來實現這個功能。我們應該提供靈活的調用接口,使調用者可以決定顯示的位置(行、列)、內容和顏色。

子程序描述

名稱:show_str

功能:在指定的位置,用指定的顏色,顯示一個用0結束的字符串。

參數:(dh)=行號(取值范圍0~24),(dl)=列號(取值范圍0~79),

         (cl)=顏色,ds:si指向字符串的首地址

返回:無

應用舉例:在屏幕的83列,用綠色顯示data段中的字符串。

 

1) 子程序的入口參數是屏幕上的行號和列號,注意在子程序內部要將它們轉化為顯存中的地址,首先要分析一下屏幕上的行列位置和顯存地址的對應關系。

2) 注意保存子程序中用到的相關寄存器。

3) 空上子程序的內部處理和顯存的結構密切相關,但是向外提供了與顯存結構無關的接口。通過調用這個子程序,進行字符串的顯示時可以不必了解顯存的結構,為編程提供了方便。在實驗中,注意體會這種設計思想。

 

2、 解決除法溢出的問題

問題:div指令可以做除法。當進行8位除法的時候,用al存儲結果的商,ah存儲結果的余數;進行16位除法的時候,用ax存儲結果的商,dx存儲結果的余數??墒?,現在有一個問題,如果結果的商大于ahax所能存儲的最大值,那么將如何?

 

CPU執行div等除法指令的時候,如果發生結果數據超出了寄存器所能存儲的范圍,將引發CPU的一個內部錯誤,這個錯誤被稱為:除法溢出。

 

子程序描述

名稱:divdw

功能:進行不會產生溢出的除法運算,被除數為dword型,除數為word型,結果為dword型。

參數:(ax)=dword型數據的低16

         (dx)=dword型數據的高16

         (cx)=除數

返回:(dx)=結果的高16位,(ax)=結果的低16

         (cx)=余數

應用舉例:計算1000000/10F4240H/0AH

 

3、 數值顯示

問題:編程:將data段中的數據以十進制的形式顯示出來。

數據在內存中都是二進制信息,標記了數值的大小。要把它們顯示到屏幕上,成為我們能夠讀懂的信息,需要進行信息的轉化。

比如,數值12666,在機器中存儲為二進制信息:11000101111010B317AH),計算機可以理解它。而我們要在顯示器上讀到可以理解的數值12666,我們看到的應該是一串字符:“12666”,由于顯卡遵循的是ASCII編碼,為了讓我們能在顯示器上看到這串字符,它在機器中應以ASCII碼的形式存儲為:31H、32H36H、36H36H(字符“0~9”對應的ASCII碼為30H~39H)。

 

通過上面的分析可以看到,在概念世界中,有一個抽象的數據12666,它表示了一個數值的大小。在現實世界中它可以有多種表示形式,可以在電子機器中以高低電平(二進制)的形式存儲,也可以在紙上、黑板上、屏幕上以人類的語言“12666”來書寫?,F在,我們面臨的問題就是,要將同一抽象的數據,從一種表示形式轉化為另一種表示形式。

 

要將數據用十進制形式顯示到屏幕上,要進行兩步工作:

1) 將用二進制信息存儲的數據轉變為十進制形式的字符串;

2) 顯示十進制形式的字符串。

 

子程序描述

名稱:dtoc

功能:將word型數據轉變為表示十進制數的字符串,字符串以0為結尾符。

參數:(ax)=word型數據

         ds:si指向字符串的首地址

返回:無

 

應用舉例:編程,將數據12666以十進制的形式在屏幕的83列,用綠色顯示出來。

 

分析:要得到字符串“12666”,就是要得到一列表示該字符串的ASCII碼:31H32H、36H、36H、36H

十進制數碼字符對應的ASCII=十進制數碼值+30H。

要得到表示十進制數的字符串,先求十進制數每位的值。

例如,對于12666,先求得每位的值:1、2、6、66。再將這些數分別加上30H,便得到了表示12666ASCII碼串,31H、32H、36H36H36H。

那么,怎樣得到每位的值呢?采用下列方法(除10取余法):

             12666/10=1266……6

                 1266/10=126……..6

            126/10=12………6

             12/10=1………..2

              1/10=0………..1

可見,用1012666,共除5次,記下每次的余數,就得到了每位的值。

綜合以上分析,可得出處理過程如下:

12666除以10,循環5次,記下每次的余數;將每次的余數分別加30H,使得到了表示十進制數的ASCII碼串。

只要是除到商為0,各位的值就已經全部求出??梢允褂?/span>jcxz指令來實現相關的功能。

 

posted on 2010-08-04 10:32 luqingfei 閱讀(24496) 評論(0)  編輯 收藏 引用 所屬分類: 匯編語言基礎學習

導航

<2009年2月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567

統計

留言簿(6)

隨筆分類(109)

隨筆檔案(105)

Blogers

Game

Life

NodeJs

Python

Useful Webs

大牛

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久亚洲国产天美传媒修理工| 亚洲国产精品成人综合色在线婷婷| 国产精品久久久久久久久动漫 | 亚洲尤物视频网| 日韩亚洲欧美成人一区| 国产精品99久久久久久人| 亚洲精选一区二区| 一区二区三区波多野结衣在线观看| 999亚洲国产精| 亚洲欧美国产日韩中文字幕 | 欧美片在线观看| 欧美成人综合| 国产精品美女久久| 国产一区二区三区四区在线观看| 国产伪娘ts一区| 亚洲电影第三页| 亚洲午夜高清视频| 久久精品国产欧美激情| 农夫在线精品视频免费观看| 亚洲国产专区校园欧美| 亚洲视频免费| 老司机午夜精品| 欧美网站在线观看| 禁久久精品乱码| 一区二区三区国产精华| 久久久夜夜夜| 日韩网站在线| 久久视频精品在线| 国产欧美在线视频| 亚洲人成小说网站色在线| 午夜免费日韩视频| 欧美 日韩 国产一区二区在线视频| 亚洲日本激情| 久久精品综合| 国产精品福利网站| 亚洲欧洲在线看| 欧美在线黄色| 99精品国产一区二区青青牛奶| 久久精品夜夜夜夜久久| 欧美午夜三级| 日韩午夜免费视频| 麻豆freexxxx性91精品| 亚洲一区一卡| 欧美日韩一区二区三区免费| 亚洲精品一二区| 欧美国产日韩一区二区三区| 亚洲在线视频| 欧美色网在线| 99视频在线精品国自产拍免费观看| 久久久夜色精品亚洲| 亚洲一区二区不卡免费| 久久综合九色| 在线视频亚洲欧美| 欧美日韩视频| 夜夜爽夜夜爽精品视频| 欧美激情欧美狂野欧美精品 | 久久久蜜桃一区二区人| 亚洲性图久久| 欧美私人网站| 亚洲制服av| 中文在线资源观看网站视频免费不卡 | 久久久国产亚洲精品| 亚洲——在线| 国产精品一卡| 久久精品国产一区二区电影| 亚洲综合精品一区二区| 国产精品五月天| 新67194成人永久网站| 日韩视频免费在线| 欧美无砖砖区免费| 欧美在线3区| 亚洲欧美一区二区三区久久| 国产农村妇女精品一二区| 久久精品99国产精品| 欧美一区二区在线播放| 精品动漫3d一区二区三区| 女仆av观看一区| 欧美高潮视频| 亚洲在线成人| 亚洲欧美日韩精品在线| 国产主播精品在线| 蜜桃精品久久久久久久免费影院| 欧美91福利在线观看| 999亚洲国产精| 亚洲视频自拍偷拍| 国产曰批免费观看久久久| 美女视频黄 久久| 欧美国产三区| 亚洲欧美日韩在线综合| 欧美一区精品| 久久这里只有| 亚洲男人第一网站| 久久久综合精品| av成人动漫| 欧美一区二区国产| 亚洲乱码国产乱码精品精可以看 | 亚洲精品在线免费| 亚洲一区二区三| 精品成人a区在线观看| 亚洲美女在线看| 国产亚洲成av人在线观看导航| 欧美成人综合一区| 国产精品视频一二| 亚洲高清影视| 国产精品香蕉在线观看| 亚洲电影免费观看高清完整版在线观看| 欧美色偷偷大香| 欧美成人第一页| 欧美视频一区二| 欧美成人精品1314www| 国产乱理伦片在线观看夜一区| 欧美~级网站不卡| 国产夜色精品一区二区av| 夜夜嗨av色综合久久久综合网 | 亚洲免费网址| 欧美1级日本1级| 欧美一区二区性| 欧美日韩国产成人在线免费| 老司机免费视频一区二区三区| 欧美午夜激情在线| 欧美高清视频一区| 国产中文一区| 亚洲欧美在线一区| 中文国产一区| 欧美精品一区二区三区蜜桃 | 国产精品高潮呻吟| 91久久久久久久久| 亚洲国产成人精品久久久国产成人一区| 亚洲一区二区三区激情| 亚洲最新在线视频| 免费看精品久久片| 蜜臀久久99精品久久久画质超高清| 国产精品日韩欧美综合 | 久久综合伊人77777麻豆| 久久精品国产69国产精品亚洲| 欧美日韩久久久久久| 亚洲国产精品国自产拍av秋霞| 在线日韩av| 老司机免费视频一区二区| 牛牛精品成人免费视频| 亚洲国产精品成人综合| 久久久www| 免播放器亚洲一区| 亚洲国产精品电影| 欧美xx69| 亚洲国产精品va在线观看黑人| 亚洲精品在线视频| 欧美另类综合| 亚洲第一在线综合网站| 一区二区日韩免费看| 亚洲宅男天堂在线观看无病毒| 欧美午夜在线一二页| 亚洲欧美激情诱惑| 欧美一区二区性| 国产一区二区三区日韩欧美| 久久精品日产第一区二区三区| 久久久水蜜桃av免费网站| 激情小说亚洲一区| 免费亚洲电影在线| 亚洲精品视频一区二区三区| 欧美精品午夜| 亚洲视频在线一区| 久久精品亚洲一区| 国产一区二区三区久久悠悠色av| 欧美一区二区三区在线播放| 欧美国产精品| 一区二区三区精品久久久| 国产精品女主播| 久久久精彩视频| 亚洲精品视频一区| 亚洲综合视频网| 在线精品视频免费观看| 欧美喷水视频| 午夜亚洲影视| 亚洲国产精品一区| 亚洲专区欧美专区| 亚洲高清不卡在线| 国产欧美在线播放| 欧美精品一区二区精品网 | 99在线热播精品免费99热| 国产精品av久久久久久麻豆网| 久久久精品2019中文字幕神马| 亚洲精品国产拍免费91在线| 久久超碰97人人做人人爱| 亚洲精品视频在线观看网站| 国产日韩欧美精品| 欧美日本韩国一区二区三区| 欧美在线免费一级片| 亚洲视频一区| 欧美激情一区二区三区在线视频| 欧美一区二视频| 亚洲一区视频在线观看视频| 在线精品高清中文字幕| 国产精品视频免费一区| 欧美国产日韩精品| 久久五月激情| 久久久一区二区| 久久久久青草大香线综合精品| 一本色道久久综合亚洲精品按摩| 欧美成人精品在线|