![微機原理Emu8086仿真軟件實驗講義_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/21/8e6e2ea6-0690-4701-a4ab-55c2fa7c6ef7/8e6e2ea6-0690-4701-a4ab-55c2fa7c6ef71.gif)
![微機原理Emu8086仿真軟件實驗講義_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/21/8e6e2ea6-0690-4701-a4ab-55c2fa7c6ef7/8e6e2ea6-0690-4701-a4ab-55c2fa7c6ef72.gif)
![微機原理Emu8086仿真軟件實驗講義_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/21/8e6e2ea6-0690-4701-a4ab-55c2fa7c6ef7/8e6e2ea6-0690-4701-a4ab-55c2fa7c6ef73.gif)
![微機原理Emu8086仿真軟件實驗講義_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/21/8e6e2ea6-0690-4701-a4ab-55c2fa7c6ef7/8e6e2ea6-0690-4701-a4ab-55c2fa7c6ef74.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、實驗一顯示程序?qū)嶒?.emu8086介紹Emu8086-Assembler and Microprocessor Emulator是一個可在 Windows 環(huán)境下運行的 8086CPU 匯編仿真軟件,Emu8086集源代碼編輯器,匯編反匯編工具以及可以運行 debug 的模擬器(虛擬機器)于一身,它優(yōu)于一般編譯器的地方在于提供了一個虛擬的80x86 環(huán)境,擁有自己一套獨立的 “硬件 ”,可以完成一些純軟件編譯器無法完成的功能例如 Led 顯示,交通燈,步進電機等等,而且動態(tài)調(diào)試( DEBUG)時非常方便一軟件啟動啟動界面如圖 1 所示,用戶可以選擇新建文本、 程序?qū)嵗?、啟動指南、近期文檔。注
2、冊的用戶名隨意,密碼112,即可成功。二新建文件單擊圖 1 中的“ New”選項,軟件會彈出如圖2 所示的選擇界面。 COM 模板適用于簡單且不需分段的程序,所有內(nèi)容均放在代碼段中,程序代碼默認從 ORG 0100H 開始; EXE 模板適用于需分段的復(fù)雜程序, 內(nèi)容按代碼段、數(shù)據(jù)段、堆棧段劃分。需要注意的是采用該模板時, 用戶不可將代碼段人為地設(shè)置為 ORG 0100H,而應(yīng)由編譯器自動完成空間分配; BIN 模板二進制文件,適用于所有用戶定義結(jié)構(gòu)類型; BOOT 模板適用于在軟盤中創(chuàng)建文件。此外,若用戶希望打開一個完全空的文檔,則可選擇empty workspace的選項。三編譯和加載程序
3、用戶可根據(jù)上述選擇的模板中編寫程序, 如圖 3 所示。該編輯界面集文檔編輯、指令編譯、程序加載、系統(tǒng)工具、在線幫助為一體, 其菜單功能如表 1 所示。編寫完程序后,用戶只需單擊工具欄上的“ compile”按鈕,即可完成程序的編譯工作,并彈出如圖 4 所示的編譯狀態(tài)界面。若有錯誤則會在窗口中提示,若無錯誤則還會彈出保存界面, 讓用戶將編譯好的文件保存相應(yīng)的文件夾中。 默認文件夾為 ,但您可以通過菜單中 assembler/ set output directory 對默認文件夾進行修改。 用戶保存的文件類型與第一階段所選擇的模板有關(guān)。完成編譯和保存文件后,用戶可按下圖 4 中的“ close”
4、按鈕先關(guān)閉該窗體,再利用工具欄上的“ emulate”按鈕打開真器界面和原程序界面進行真調(diào)試,也可以按下圖 4 中的 Run 按鈕運行直接程序。表 1 編譯器菜單功能一級菜單名稱二級菜單名稱三級菜單名稱功能file文件new新建comtemplatecom 模板exetemplateexe 模板bintemplatebin 模板boottemplateboot 模板example實例open打開文件save保存文件save as另存為prints打印文件export to HTML轉(zhuǎn)換為超文本文件exit退出edit編輯undo取消redo重復(fù)cut剪切cope復(fù)制paste粘貼selecta
5、ll選擇全部find查找findnext查找下一個replace代替indent縮進outdent凸出commentblock將被選塊變?yōu)樽⑨寀ncomment block將被注釋變?yōu)橹噶頰dvancededitor高級宏匯編macrosadvanced高級設(shè)置Show line顯示行編號numberstabitfy selection空格轉(zhuǎn)換為定位字元untabitfy定位字元轉(zhuǎn)換為空格selectionlowercase用小寫字母表示selectionuppercase用大寫字母表示selectiondisplay white顯示出空格出空間spacebookmark書簽toggle bo
6、okmark在光標(biāo)處放置標(biāo)簽previous跳到上一個標(biāo)簽處bookmarknext bookmark跳到下一個標(biāo)簽處jump to first跳到第一個標(biāo)簽處jump to last跳到最后一個標(biāo)簽處clear all清除所有標(biāo)簽bookmarkassembler匯編compile編譯compile and load編譯并加載到真器中in the emulationfasmFasm匯編set output設(shè)置輸出文件夾directoryemulator真器show emulator顯示真窗口assemble andload in the編譯并加載到真器中emulatormath數(shù)學(xué)計算mul
7、ti base多進制基本計算器calculatorbase converter基本轉(zhuǎn)換器ascii codeASCII 碼表help幫助documentation文檔及指南and tutorialscheck for an軟件更新檢查updateabout關(guān)于軟件四仿真調(diào)試當(dāng)用戶完成程序編譯后,利用工具欄中的“ emulate”按鈕可將編譯好的文件加載到仿真器進行真調(diào)試。除使用“ emulate”按鈕外,用戶也可以用菜單欄中的 assembler/compile and load in the emulation或 emulator/assemble and load in the emula
8、tor打開仿真器。仿真器界面如圖 5 所示。當(dāng)用戶將程序加載到仿真器后, 會同時打開仿真器界面和源程序界面, 用戶在仿真器界面中也可以同時看到源代碼和編譯后的機器碼。 點擊的任意一條源程序指令,則對應(yīng)的機器代碼顯示為被選顯示狀態(tài), 與此同時,上面的代碼指針也會相應(yīng)變化。用戶也可以通過這種操作了解, 數(shù)據(jù)段和堆棧段中各變量或數(shù)據(jù)在存儲器中的情況。用戶可以利用工具欄中的“ single step”按鈕進行單步跟蹤調(diào)試,以便仔細觀察各寄存器、 存儲器、變量、標(biāo)記位等情況, 這對于程序初始調(diào)試時十分有用;當(dāng)程序調(diào)試完畢,或需要連續(xù)運行觀察時,則可以使用“ run”按鈕;當(dāng)希望返回上一步操作時,則可以使
9、用“ step back”按鈕;若單擊“ reload”按鈕,則真器會重新加載程序, 并將指令指針指向程序的第一條指令; 您也可以利用 “ load” 按鈕,從您保存的文件夾中加載其它程序。 用戶除使用上述工具欄中的按鈕進行仿真調(diào)試外,還可以利用其菜單中的其它功能進行更高級的調(diào)試和設(shè)置。 菜單的詳細功能見表 2 所示。表 2 真器菜單功能一級菜單名稱二級菜單名稱功能file文件load executable加載要執(zhí)行的程序reload重新加載程序examples打開實例reset emulator and ram復(fù)位真器和 RAMset command line parameter設(shè)置命令行參
10、數(shù)set the emulator s state保存真器設(shè)置load form previous state載入原先保存的設(shè)置math數(shù)學(xué)計算multi base calculator多進制基本計算器base converter基本轉(zhuǎn)換器debugsingle step單步跟蹤single over單步step back單步返回stop on condition設(shè)置停止運行的條件run until運行到光標(biāo)處run連續(xù)運行set break point在光標(biāo)處設(shè)置斷點clear break point清除所有斷點show current break point顯示當(dāng)前斷點指令show cur
11、rent instruction (at CS :IP)顯示當(dāng)前指令set CS:IP to selected position將被選指令設(shè)定為當(dāng)前指令view觀察log and debug.exe emulation打開 debug.調(diào)試窗口extend value viewer打開擴展數(shù)值觀察器stack打開堆棧窗口variables打開變量窗口symbol table打開標(biāo)記表顯示源程序及目標(biāo)文件內(nèi)listing容original source code打開源程序代碼窗口軟件高級設(shè)置,可對字體、option顏色、文本格式、鍵盤輸入等進行設(shè)置選擇打開存儲器、寄存器arithmetic &a
12、mp; logical unit等單元,與 AUX 按鈕功能相同flag打開標(biāo)記位窗口lexicalflag analyser打開文本說明格式的標(biāo)記位窗口ascii code打開 ASCII 碼表emulator screen打開模擬屏幕窗口external外部真器start debug.exe啟動 windows 的 debug 真調(diào)試器command prompt打開 DOS 命令窗口run在 DOS 環(huán)境下運行程序virtual devices虛擬設(shè)備LED-Disply.exeLED 顯示器printer.exe打印機robit.exe機器人simple.exe讀寫端口simplest
13、.exe在屏幕上讀寫端口stepper_motor.exe步進馬達thermometer.exe溫度控制tranffic_lights交通燈控制VGA_STATE.exe顯示屏控制Virtual drive虛擬驅(qū)動盤boot form virtual floppy (floppy_0)從虛擬的軟盤中導(dǎo)入程序write 512 byte at 0000:7C00 to boot將存儲器中 07C00 單元開始的 512 個字節(jié)寫到軟盤sector(floppy_0) (中write“ .bin ” file to floppy將 bin 文件寫到軟盤中create new floppy driv
14、e創(chuàng)建一個新的軟盤2.實驗?zāi)康?1)熟悉 emu8086 集成環(huán)境和調(diào)試器的使用。(2)掌握部分DOS功能調(diào)用使用方法。3.實驗內(nèi)容本實驗要求顯示一串字符。注釋:INT10H 是由 BIOS 對屏幕及顯示器所提供的服務(wù)程序,這些服務(wù)程序也加掛在INT10H 內(nèi)。使用 INT10H 中斷服務(wù)程序時,先指定 AH 寄存器為下表編號其中之一,該編號表示欲調(diào)用的功用,而其他寄存器的詳細說明,參考表后文字,當(dāng)一切設(shè)定好之后再調(diào)用INT10H。AH: 00H設(shè)置顯示器模式AL:03H 80×2516 色文本AH: 10HAL: 03H設(shè)置顏色中斷。觸發(fā)閃爍 / 亮顯位4.參考程序 :name &
15、quot;hi-world" this example prints out"hello world!" by writing directly to video memory.; in vga memory: first byte is ascii character, byte that follows is character attribute.; if you change the second byte, you can change the color of; the character even after it is printed.; char
16、acter attribute is 8 bit value,; high 4 bits set background color and low 4 bits set foreground color.; hexbincolor; 00000black; 10001blue; 20010green; 30011cyan; 40100red; 50101magenta; 60110brown; 70111light gray; 81000dark gray; 91001light blue; a1010light green; b1011light cyan; c1100light red;
17、d1101light magenta; e1110yellow; f1111whiteorg 100h; set video modemov ax, 3; text mode 80x25, 16 colors, 8 pages (ah=0, al=3)int 10h; do it!; cancel blinking and enable all 16 colors: mov ax, 1003hmov bx, 0int 10h; set segment register:movax, 0b800hmovds, ax; print "hello world" first byt
18、e is ascii code, second byte is color code.mov 02h, 'H'mov 04h, 'e'mov 06h, 'l'mov 08h, 'l'mov 0ah, 'o'mov 0ch, ','mov 0eh, 'W'mov 10h, 'o'mov 12h, 'r'mov 14h, 'l'mov 16h, 'd'mov 18h, '!' color all charac
19、ters:mov cx, 12 ; number of characters.mov di, 03h ; start from byte after 'h'c: mov di, 11101100b ; light red(1100) on yellow(1110) add di, 2 ; skip over next ascii code in vga memory. loop c; wait for any key press: mov ah, 0int 16hret5.總結(jié)思考1.DS 數(shù)據(jù)段寄存器:數(shù)據(jù)所存放段的起始地址b800h, 觀察內(nèi)存b800:0000 的存放內(nèi)容
20、2. movmovax, 0b800hds, ax改為movds, 0b800h是否可行實驗二十進制數(shù)的 BCD 碼加法運算程序?qū)嶒?.實驗?zāi)康?1) 掌握運算類指令編程及調(diào)試方法。(2) 掌握運算類指令對各狀態(tài)標(biāo)志位的影響及測試方法。2.實驗原理(1) 二進制數(shù)在計算機上進行運算是非常簡單的。但是, 通常人們習(xí)慣于用十進制數(shù)。在計算機中十進制數(shù)是用BCD碼來表示的,BCD碼有兩類:一類叫壓縮型BCD碼,一類叫非壓縮型BCD碼。壓縮BCD碼與非壓縮BCD碼的區(qū)別壓縮 BCD碼的每一位用4 位二進制表示,一個字節(jié)表示兩位十進制數(shù)。例如10010110B 表示十進制數(shù)96D;非壓縮BCD碼用 1
21、個字節(jié)表示一位十進制數(shù),高四位總是0000,低 4 位的 00001001 表示 09. 例如 00001000B 表示十進制數(shù)8.8421 BCD 碼是最基本和最常用的BCD碼,它和四位自然二進制碼相似,各位的權(quán)值為8、 4、2、 1,故稱為有權(quán) BCD碼。和四位自然二進制碼不同的是,它只選用了四位二進制碼中前10 組代碼,即用 00001001 分別代表它所對應(yīng)的十進制數(shù),余下的六組代碼不用。用 BCD碼進行加、減、乘、除運算,通常采用兩種方法:一種是在指令系統(tǒng)中設(shè)置一套專用于 BCD碼運算的指令; 另一種是利用二進制數(shù)的運算指令算出結(jié)果,然后再用專門的指令對結(jié)果進行修正(調(diào)整),使之轉(zhuǎn)變
22、為正確的 BCD碼表示的結(jié)果。 8086 8088 指令系統(tǒng)所采用的是后一種方法。BCD碼的運算規(guī)則: BCD碼是十進制數(shù), 而運算器對數(shù)據(jù)做加減運算時, 都是按二進制運算規(guī)則進行處理的。這樣,當(dāng)將 BCD 碼傳送給運算器進行運算時,其結(jié)果需要修正。修正的規(guī)則是:當(dāng)兩個 BCD碼相加,如果和等于或小于 1001( 即十進制數(shù) 9) ,不需要修正; 如果相加之和在 1010 到 1111( 即十六進制數(shù) 0AH 0FH)之間,則需加 6 進行修正;如果相加時,本位產(chǎn)生了進位,也需加 6 進行修正。 這樣做的原因是, 機器按二進制相加, 所以 4 位二進制數(shù)相加時, 是按“逢十六進一”的原則進行運
23、算的,而實質(zhì)上是 2 個十進制數(shù)相加,應(yīng)該按“逢十進一”的原則相加, 16 與 10 相差 6 ,所以當(dāng)和超過 9 或有進位時,都要加 6 進行修正。需要修正BCD 碼運算值的舉例。(1) 計算 5+8 ; (2) 計算 8+8解: (1)將 5和 8以 8421 BCD 輸入機器,則運算如下:0101+)10001101結(jié)果大于 9+)0110加 6修正10011即 13的 BCD碼結(jié)果是 0011,即十進制數(shù)3,還產(chǎn)生了進位。5+8=13 ,結(jié)論正確。(2) 將 8 以 8421 BCD 輸入機器,則運算如下:1000+)100010000結(jié)果大于 9+)0110加 6修正1011016的
24、 BCD碼結(jié)果是 0110 ,即十進制的6,而且產(chǎn)生進位。8+8=16 ,結(jié)論正確。( 2)非壓縮型BCD碼加法調(diào)整指令A(yù)AA(ASCIIAdjustforAddition)指令格式:AAAAAA也稱為加法的ASCII 調(diào)整指令。指令后面不寫操作數(shù),但實際上隱含累加器操作數(shù)AL 和 AH。指令的操作為:如果(AL) 0FH>9,或 (AF)=1則(AL) (AL)+06H(AH) (AH)+1(AF) 1(CF) (AF)(AL) (AL) 0FH)否則(AL) (AL) 0FH)由上可見,指令將影響AF 和 CF 標(biāo)志,但狀態(tài)標(biāo)志位SF、 ZF、PF 和 OF的狀態(tài)不確定。在用 AAA
25、指令調(diào)整以前,先用指令A(yù)DD(多字節(jié)加法時用ADC)進行8 位數(shù)的加法運算,相加結(jié)果放在AL 中, 用 AAA指令調(diào)整后,非壓縮型BCD碼結(jié)果的低位在AL 寄存器,高位在AH 寄存器。3.實驗內(nèi)容:本實驗要求計算X+Y=Z,其中, X、 Y、 Z 為 BCD碼,其中X=09H, Y=05H。4.參考程序 :; this example shows the use of aaa instruction (ascii adjust after addition).; it is used to add huge bcd "bcd_aaa"org100h
26、; first number '9':movah, 09h; second number '5':moval, 05h; al = al + ah =; = 09h + 05h = 0ehaddal, ah; clear tens byte of bcd; result:xorah, ah; adjust result to bcd form,; ah = 1, al = 4->'14'aaa; print the result:; store contents of; ax register:movdx, ax; print first
27、digit:movah, 0eh; convert to ascii:ordh, 30hmoval, dhint10h; print second digit:; convert to ascii:ordl, 30hmoval, dlint10h; wait for any key press: mov ah, 0int 16hret; return control to operating system.5 總結(jié)思考 :(1)xor指令含義 ; (2)aaa指令的操作過程實驗三串操作類指令應(yīng)用程序1.實驗?zāi)康?1) 掌握串操作類指令編程及調(diào)試方法。(2) 掌握串操作類指令對各狀態(tài)標(biāo)志位的影響
28、及測試方法。2.實驗原理( 1)在計算機中,大部分數(shù)據(jù)存放在主存中,8086CPU提供了一組處理主存中連續(xù)存放的數(shù)據(jù)串的指令串操作指令。串操作指令中,源操作數(shù)用寄存器SI 尋址,默認在數(shù)據(jù)段DS中;目的操作數(shù)用寄存器DI 尋址,默認在附加段ES中。每執(zhí)行一次串操作指令,作為源地址指針的 SI 和作為目的地址指針的DI 將自動修改: +/-1 (對于字節(jié)串)或+/-2 (對于字串)。地址指針時增加還是減少取決于方向標(biāo)志DF。在系統(tǒng)初始化后或者執(zhí)行指令CLD指令后, DF=0, 此時地址指針增1 或 2;在執(zhí)行指令STD后, DF=1,此時地址指針減1 或 2。串操作指令尋址方式:源操作數(shù)和目的操
29、作數(shù)分別使用寄存器DS:SI和ES:DI進行間接尋址, 源指針DS:SI和目的指針ES:DI將自動進行修改:±1、± 2、± 4,其對應(yīng)的分別是字節(jié)操作、字操作和雙字操作。串比較指令:CMPSB;字節(jié)串比較:DS:SI-ES:DI,SI SI+/-1,DI DI+/-1CMPSW;字串比較: DS:SI-ES:DI,SI SI+/-2,DI DI+/-2比較指令的功能是比較源串與目的串是否相同, 并根據(jù)其減法結(jié)果設(shè)置標(biāo)志位;指令在每次比較后修改SI 和 DI 寄存器的值, 使之指向下一個元素。串掃描指令:格式功能1: SCASB1: AL( DI ),DIDI;字
30、節(jié)操作± 1格式功能2: SCASW2: AX( DI ),DIDI;字操作± 2重復(fù)前綴指令:任何一個串操作指令,都可以在前面加一個重復(fù)前綴,以實現(xiàn)串操作的重復(fù)執(zhí)行,重復(fù)次數(shù)隱含在 CX寄存器中REP;REP前綴用在MOVS、STOS、LODS指令前, 每次執(zhí)行一次指令,CX 減 1;直到 CX=0,重復(fù)執(zhí)行結(jié)束.REPZ;也可以表示為斷 ZF 標(biāo)志是否為REPE,用在 CMPS、SCAS指令前,每執(zhí)行一次串指令0; 只要 CX=0或 ZF=0,則重復(fù)執(zhí)行結(jié)束。CX 減1,并判REPNZ;也可以表達為REPNE,用在CMPS、SCAS指令前, 每執(zhí)行一次串操作指令CX減1
31、,并判斷ZF 標(biāo)志是否為1,只要CX=0或ZF=1, 則重復(fù)執(zhí)行結(jié)束。REP前綴可以理解為“當(dāng)數(shù)據(jù)串沒有結(jié)束(CX 0) , 則繼續(xù)傳送”REPZ/REPE前綴可以理解為“當(dāng)數(shù)據(jù)串沒有結(jié)束(CX 0) , 并且串相等(ZF=1)則繼續(xù)比較”REPNZ/REPNE前綴可以理解為“當(dāng)數(shù)據(jù)串沒有結(jié)束( CX0), 并且串不相等 ( ZF=0)則繼續(xù)比較”(2) $ 是指當(dāng)前指令的地址3.實驗內(nèi)容3.1 利用 repe cmps指令比較兩個字符串是否相等。若相等,顯示字符Y,否則顯示N。3.2利用 repnescasb指令在一個字符串中查找一個指定的字符。4.參考程序 :4.1; how to use
32、 cmpsb instruction to compare byte "cmpsb"org100h; set forward direction: cld; load source into ds:si,; load target into es:di:movax, csmovds, axmoves, axleasi, str1leadi, str2; set counter to string length:movcx, size; compare until equal: repe cmpsbjnznot_equal; "yes&qu
33、ot; - equal!moval, 'y'movah, 0ehint10hjmpexit_herenot_equal:; "no" - not equal!moval, 'n'movah, 0ehint10hexit_here:; wait for any key press: mov ah, 0int 16hret; strings must have equal lengths: x1:str1 db 'test string' str2 db 'test string' size = ($ - x1)
34、/ 24.2; this sample shows how to use scasb instruction to find a 100hjmp startstr1 db 'aaabbbxddd's_found db '"yes" - found!', 0Dh,0Ah, '$'s_notdb '"no" - not found!', 0Dh,0Ah, '$'find_what equ 'x'start:; set forward dire
35、ction: cld; set counter to string size: mov cx, 10; load string address into es:di mov ax, csmov es, ax lea di, str1; we will look for the character in string: mov al, find_whatrepnescasbjzfoundnot_found:; "no" - not found!mov dx, offset s_notmov ah, 9int 21hjmp exit_herefound:; "yes&
36、quot; - found!mov dx, offset s_foundmov ah, 9int 21h; wait for any key press.mov ah, 0 int 16hexit_here:ret5.思考寫出參考程序1和 2的流程圖實驗四堆棧指令程序1.實驗?zāi)康?1)掌握堆棧類指令編程及調(diào)試方法。(2)掌握堆棧類指令對各狀態(tài)標(biāo)志位的影響及測試方法。2.實驗原理堆棧是存儲器中專用的緩沖區(qū),用于暫存寄存器數(shù)據(jù)或地址指針,push/pop就用于堆棧的操作,這兩個指令一般用在:1. 子程序調(diào)用, 為了保護現(xiàn)場,把所要用的寄存器中的內(nèi)容先暫時保存起來,在子程序調(diào)用結(jié)束之前,按照先進后出
37、的原則,把數(shù)據(jù)恢復(fù)。2. 有時候,需要臨時用一下某些寄存器,也可用一下,憑個人喜好。堆棧是一個先進后出的主存區(qū)域,位于堆棧段中,使用SS段寄存器記錄器段地址。棧只有一個出口,即當(dāng)前棧頂。棧頂是地址較小的一端(低端),它用堆棧指針寄存器SP指定。 堆棧的兩種基本操作,對應(yīng)兩條基本指令:( 1)進棧指令 push進棧指令先使堆棧指令sp 減 2,然后把一個字操作數(shù)存入堆棧頂部。堆棧操作的對象只能是字操作數(shù),進棧時底字節(jié)存放于低地址,高字節(jié)存放于高地址,sp 相應(yīng)向低地址移動兩個字節(jié)單元。(2) 出棧指令pop出棧指令把棧頂?shù)囊粋€字傳送至指定的目的操作數(shù),然后堆棧指針sp 加 2。目的操作數(shù)應(yīng)為字操
38、作數(shù),字從棧頂彈出時,低地址字節(jié)送低字節(jié),高地址字節(jié)送高字節(jié)。注意:因為堆棧指針sp 總是指向已經(jīng)存入數(shù)據(jù)的棧頂(不是空單元) ,所以 PUSH指令是將( SP)減 2,后將內(nèi)容壓棧(即先修改SP 是指指向空單元,后壓入數(shù)據(jù)),而POP是先從棧頂彈出一個字,后將堆棧指針SP加 2.用 PUSH指令和POP指令時只能按字訪問堆棧,不能按字節(jié)訪問堆棧。3.實驗內(nèi)容通過堆棧指令觀察堆棧寄存器內(nèi)容的變化4.參考程序 :; this sample shows how the stack works.; click 'stack' button in emulator to see the
39、 contents of the stack.; stack is important element in computer architecture.; this code does nothing useful, except printing "Hi" in the "stack"org100h ; create tiny com file.movax, 1234hpushaxmovdx, 5678hpushdxpopbxpopcx; function call pushes ip value of the next instr
40、uction:calltfuncmovax, 7890hpushaxpopbx; interrupts are like funtions,; but in addition they push code segment into the stackmovax, 3int10h; set standart video mode.; a typical use of stack is to set segment registers.; set ds to video memory segment:movax, 0b800hpushaxpopds; print "hi":mo
41、v170h, 'H'mov172h, 'i' color attribute for 'h'mov171h, 11001110b; color attribute for 'i'mov173h, 10011110b; wait for any key press.movintah, 016h; here we "pop" the ip value,; and return control to the operating system: ret; the test procedure:tfuncprocxorx
42、orbx, bxcx, cx; here we "pop" the ip value,; and return control to the main program:retendp5.思考列出參考程序的堆棧內(nèi)容變化過程實驗五求找最大值和最小值程序設(shè)計1.實驗?zāi)康?1) 掌握比較類指令編程及調(diào)試方法。( 2)掌握綜合程序的設(shè)計及調(diào)試2. 實驗原理微機系統(tǒng)的內(nèi)存是分段管理的,為了與之相對應(yīng),匯編語言源程序也分若干個段來構(gòu)成。8086CPU有四個段寄存器CS,DS,ED,SS.2.1 段定義段名SEGMENT,;段內(nèi)的具體內(nèi)容,段名ENDS例如參考程序的數(shù)據(jù)段DDATASEGM
43、ENTMES1DB 'The leastnumber is:$'MES2DB 0AH,0DH,'The largest number is:$'NUMBDB 0D9H,07H,8BH,0C5H,0EBH,04H,9DH,0F9HDDATAENDS代碼段CODE SEGMENTASSUME CS:CODE,DS:DDATA;CODE ENDS2.2 段寄存器說明語句每個段都要與一個段寄存器建立一種對應(yīng)關(guān)系。建立這種對應(yīng)關(guān)系的說明語句格式:ASSUME段寄存器名 :段名 , 段寄存器名 :段名 ,.(1)通常情況下,代碼段的第一條語句就是用ASSUME 語句來說明段寄存器與段之間的對應(yīng)關(guān)系。參考程序 ASSUME CS:CODE,DS:DDATA該語句說明: CS 對應(yīng)于代碼段CODE ,DS 對應(yīng)于數(shù)據(jù)段DDATA( 2)ASSUME 說明語句只起說明作用,它不會對段寄存器賦值,所以,必須對有關(guān)段寄存器賦值,參考程序代碼:MOVAX,DDATAMOVDS,AX( 3)代碼段寄存器不能由程序員在源程序中對其賦值, 其值是由操作系統(tǒng)在裝入它進入系統(tǒng)運行時自動賦值的(4)堆棧段是一個特殊的段,在程序中可以定義它,也可以不定義。除了要生成COM 型執(zhí)行文件
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公路模板租賃合同范本
- 內(nèi)部綠化施工合同范本
- 個人轉(zhuǎn)讓鍋爐合同范本
- 企業(yè)農(nóng)行貸款合同范本
- 兄弟合作創(chuàng)業(yè)合同范例
- 出售老舊平房合同范本
- 農(nóng)村收購木材合同范例
- 2025年γ-丁內(nèi)酯項目可行性研究報告
- 2025年度建筑消防疏散指示標(biāo)識安裝施工合同
- 2025年度綠色節(jié)能建筑工程承包補充協(xié)議
- 航天器用j30jh系列微型矩形電連接器
- 工程量清單及招標(biāo)控制價編制方案
- 納龍心電說明書
- 2023湖北成人學(xué)位英語考試真題及答案1
- 《大數(shù)據(jù)金融》教學(xué)大綱(第六學(xué)期)附課程考核標(biāo)準(zhǔn)
- 物業(yè)管理企業(yè)用工風(fēng)險與防范對策
- 拜耳法氧化鋁生產(chǎn)工藝流程框圖
- 零售藥店處方藥銷售自查整改報告word(范文)
- 叉車日常維護保養(yǎng)檢查記錄表
- 心源性休克的護理.ppt課件
- 精品解析:2022年黑龍江省哈爾濱市中考語文試題(原卷版)
評論
0/150
提交評論