版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第10章call和ret指令ret和retf指令call指令ret和call指令配合完成子程序調(diào)用mul乘法指令模塊化程序設(shè)計(jì)一、返回指令ret和retf格式:ret
;實(shí)現(xiàn)近轉(zhuǎn)移,相當(dāng)于popip 格式:retf;實(shí)現(xiàn)遠(yuǎn)轉(zhuǎn)移,相當(dāng)于popip,popcsassumecs:codestack segmentdb16dup(0)stack endscode segmentmovax,4c00hint21hstart:movax,stack movss,ax movsp,16 movax,0 pushax movbx,0 retcode endsend startassumecs:codestack segmentdb16dup(0)stack endscode segmentmovax,4c00hint21hstart:movax,stack movss,ax movsp,16 movax,0 pushcs pushax movbx,0 retfcode endsend start一、返回指令ret和retf格式:ret
;實(shí)現(xiàn)近轉(zhuǎn)移,相當(dāng)于popip 格式:retf;實(shí)現(xiàn)遠(yuǎn)轉(zhuǎn)移,相當(dāng)于popip,popcs例10-1.補(bǔ)全程序,實(shí)現(xiàn)從內(nèi)存1000:0處開(kāi)始執(zhí)行指令。assume cs:codestack segment db16dup(0)stack endscode segmentstart: movax,stack movss,ax movsp,16 movax,
pushax movax,
pushax retfcode endsend startret和retf指令執(zhí)行時(shí),將當(dāng)前堆棧內(nèi)容分別出棧給ip或ip和cs,以實(shí)現(xiàn)指令的近或遠(yuǎn)轉(zhuǎn)移。二、call指令執(zhí)行call指令的功能相當(dāng)于:1、puship或pushcs、puship;2、修改當(dāng)前ip或ip和cs指向目的地址。Call指令的主要格式:根據(jù)位移轉(zhuǎn)移轉(zhuǎn)移的目的地址在指令中轉(zhuǎn)移地址在寄存器中轉(zhuǎn)移地址在內(nèi)存中
1、依據(jù)位移進(jìn)行轉(zhuǎn)移的call指令格式:
call標(biāo)號(hào)功能:將當(dāng)前IP壓棧,IP=IP+16位的位移量,轉(zhuǎn)移到標(biāo)號(hào)處執(zhí)行。例10-2下面的程序執(zhí)行后,AX中的數(shù)值為多少??jī)?nèi)存地址 機(jī)器碼 匯編指令1000:0 B80000 MOVAX,01000:3 E80100 CALLS1000:6 40 INCAX1000:7 58 S:POPAX2、轉(zhuǎn)移的目的地址在指令中的call指令格式:
callfarptr標(biāo)號(hào)功能:
將當(dāng)前CS、IP壓棧,用標(biāo)號(hào)所在地址修改CS和IP實(shí)現(xiàn)遠(yuǎn)轉(zhuǎn)移。例10-3下面的程序執(zhí)行后,AX中的數(shù)值為多少??jī)?nèi)存地址 機(jī)器碼 匯編指令1000:0 B80000 MOVAX,01000:3 9A09000010 CALLFARPTRS1000:8 40 INCAX1000:9 58 S:POPAX ADDAX,AX POPBX ADDAX,BX3、轉(zhuǎn)移地址在寄存器中的call指令格式:
callreg(16位的寄存器)功能:
將當(dāng)前IP壓棧,用寄存器中的值修改IP實(shí)現(xiàn)近轉(zhuǎn)移。例10-4下面的程序執(zhí)行后,AX中的數(shù)值為多少??jī)?nèi)存地址 機(jī)器碼 匯編指令1000:0 B80600 MOVAX,61000:2 FFD0 CALLAX1000:5 40 INCAX1000:6 MOVBP,SP ADDAX,[BP]4、轉(zhuǎn)移地址在內(nèi)存中的call指令格式:
callword(dword)ptr[內(nèi)存單元]功能:
將當(dāng)前IP或IP、CS壓棧,用內(nèi)存單元中的字或雙字修改IP或IP和CS。movsp,10hmovax,0123hmovds:[0],axmovwordptrds:[2],0calldwordptrds:[0]執(zhí)行后IP=?CS=?例10-5下面的程序執(zhí)行后,AX中的數(shù)值為多少?Assume cs:codeStack segment dw8dup(0)Stack endsCode segmentStart:movax,stack movss,ax movsp,16 movds,ax movax,0 callwordptrds:[0eh] incax incax incaxCode endsEnd startss(ds):000:000100:000200:000300:000400:000500:000600:000700:000800:000900:000A00:000B00:000C00:000D00:000E00:000F00:0010spspIP4、轉(zhuǎn)移地址在內(nèi)存中的call指令格式:
callword(dword)ptr[內(nèi)存單元]功能:
將當(dāng)前IP或IP、CS壓棧,用內(nèi)存單元中的字或雙字修改IP或IP和CS。例10-5下面的程序執(zhí)行后,ax和bx中的數(shù)值為多少?assume cs:codestack segment dw8dup(0)stack endscode segmentstart:movax,data movss,ax movsp,16 movwordptrss:[0],offsets movss:[2],cs calldwordptrss:[0] nops: movax,offsets subax,ss:[0ch] movbx,cs subbx,ss:[0eh]code endsend startss:000:000100:000200:000300:000400:000500:000600:000700:000800:000900:000A00:000B00:000C00:000D00:000E00:000F00:0010spsp1900CSCSsp1800AX=0001hBX=0000h二、call指令執(zhí)行call指令的功能相當(dāng)于:1、puship或pushcs、puship;2、修改當(dāng)前ip或ip和cs指向目的地址。Call指令的主要格式:根據(jù)位移轉(zhuǎn)移轉(zhuǎn)移的目的地址在指令中轉(zhuǎn)移地址在寄存器中轉(zhuǎn)移地址在內(nèi)存中Call標(biāo)號(hào)
Callfarptr標(biāo)號(hào)
Callreg(16位)Callword(dword)ptr[內(nèi)存]jmp標(biāo)號(hào)jmpfarptr標(biāo)號(hào)jmpregjmpword(dword)ptr[內(nèi)存]三、call和ret配合使用(實(shí)現(xiàn)子程序調(diào)用)問(wèn)題10-1下面程序返回前,BX中的值為多少?assumecs:codecode segmentstart:movax,1 movcx,3 calls movbx,ax movax,4c00h int21hs: addax,ax loops
retcode endsend start
源程序 內(nèi)存中的情況(設(shè)程序從1000:0處裝入)Assumecs:code Stacksegmentdb8dup(0) 1000:0000 0000000000000000db8dup(0) 1000:0008 0000000000000000Stack ends Code segmentStart: movax,stack 1001:0000 B80010 movss,ax 1001:0003 8ED0 movsp,16 1001:0005 BC1000 movax,1000 1001:0008 B8E803 calls 1001:000B E80500 movax,4c00h 1001:000E B8004C int21h 1001:0011 CD21S: addax,ax 1001:0013 03C0 ret 1001:0015 C3Code endsEnd start使用call和ret實(shí)現(xiàn)子程序:子程序的格式框架:具有子程序的源程序的框架:標(biāo)號(hào): 指令
retassumecs:codecode segmentstart:
calls1 movax,4c00h int21hs1:
calls2
rets2:
retCode endsEnd start四、乘法指令mul格式:mulreg mul[內(nèi)存單元]功能:字節(jié)(8位)或字(16位)的無(wú)符號(hào)相乘。說(shuō)明:兩個(gè)相乘的數(shù)位數(shù)相同,8位乘法(乘數(shù)和被乘數(shù)都為8位數(shù));16位乘法(乘數(shù)和被乘數(shù)都為16位。)8位乘法中,一個(gè)乘數(shù)默認(rèn)在AL中,另一個(gè)由指令給出,16位的結(jié)果默認(rèn)保存在AX中。16位乘法中,一個(gè)乘數(shù)默認(rèn)在AX中,另一個(gè)由指令給出,32位的結(jié)果中高位保存在DX中,低位在AX中。例:計(jì)算100×10Moval,100Movbl,10Mulbl例:計(jì)算100×10000Movax,100Movbx,10000Mulbx五、模塊化程序設(shè)計(jì)
用call和ret指令可實(shí)現(xiàn)匯編語(yǔ)言中的模塊化設(shè)計(jì),可使用call指令在主程序中調(diào)用子程序來(lái)解決子問(wèn)題,子問(wèn)題解決后用ret指令來(lái)返回主程序。一、子程序中的參數(shù)和結(jié)果例:計(jì)算N的3次方的子程序;說(shuō)明:計(jì)算N的3次方;參數(shù):(BX)=N;結(jié)果:(DX:AX)=N3Cube:movax,bx mulbx mulbx ret注:在編寫(xiě)程序時(shí),應(yīng)對(duì)程序有必要的注釋內(nèi)容。子程序的注釋中應(yīng)包含子程序的功能、參數(shù)和結(jié)果的說(shuō)明。編程:計(jì)算data段中第一組數(shù)據(jù)的3次方,結(jié)果保存到后面的一組dword單元中。Assume cs:codeData segment dw1,2,3,4,5,6,7,8 dd0,0,0,0,0,0,0,0Data endsCode segment start: movax,data movds,ax movsi,0 movdi,16 movcx,8 s: movbx,[si] callcube mov[di],ax mov[di+2],dx addsi,2 adddi,4 loops movax,4c00h int21h
二、批量數(shù)據(jù)的傳遞例:編寫(xiě)子程序,將一個(gè)全是字母的字符串轉(zhuǎn)化為大寫(xiě)。兩個(gè)問(wèn)題:字符串的內(nèi)容字符串的長(zhǎng)度思路: 將字符串的首地址放在寄存器中傳遞給子程序,用字符串的長(zhǎng)度定義循環(huán)的次數(shù)。;將ds:si所指單元中的字母轉(zhuǎn)化為大寫(xiě);字符串的長(zhǎng)度=CX;結(jié)果保存回原地址Capital:andbyteptr[si],11011111b incsi loopcapital ret例:編程將data段中的字符串轉(zhuǎn)化為大寫(xiě)assume cs:codedata segment db‘conversation’data endscode segment start: movax,data movds,ax movsi,0 movcx,12 callcapital movax,4c00h int21h capital:code endsend start匯編語(yǔ)言2013秋季中南大學(xué)軟件學(xué)院聯(lián)系方法主講教師:曾鋒博士地址:電子樓513電話(huà)件地址:fengzeng@(QQ:443133)告訴我你的聯(lián)系方式!是否有科代表?能否建立QQ群交流本課程相關(guān)問(wèn)題?學(xué)時(shí)分配課程屬性:專(zhuān)業(yè)選修課總學(xué)時(shí)數(shù):32課內(nèi)學(xué)時(shí):32講課學(xué)時(shí)數(shù):24實(shí)驗(yàn)學(xué)時(shí)數(shù):8學(xué)分:2內(nèi)容與要求1、地位
計(jì)算機(jī)相關(guān)專(zhuān)業(yè)的必修基礎(chǔ)課,與《微機(jī)原理》、《計(jì)算機(jī)組成原理》、《操作系統(tǒng)》等課程關(guān)系緊密,是一門(mén)重要的專(zhuān)業(yè)基礎(chǔ)課。 先修知識(shí):C語(yǔ)言或其它高級(jí)語(yǔ)言、二進(jìn)制及十六進(jìn)制的運(yùn)算2、參考教材
王爽《匯編語(yǔ)言》(第2版)清華大學(xué)出版社
(每人必備)考核方式平時(shí)作業(yè)和表現(xiàn)(占20%)+實(shí)驗(yàn)(占10%)+筆試(70%)考核方式和評(píng)分標(biāo)準(zhǔn)課程設(shè)計(jì)(課外自由完成)打字游戲貪吃蛇第1章基礎(chǔ)知識(shí)機(jī)器語(yǔ)言匯編語(yǔ)言的產(chǎn)生和組成存儲(chǔ)器指令和數(shù)據(jù)存儲(chǔ)單元CPU對(duì)存儲(chǔ)器的讀寫(xiě)三總線(xiàn)結(jié)構(gòu)一、機(jī)器語(yǔ)言機(jī)器指令:是一系例由二進(jìn)制數(shù)(0或1)組成的代碼構(gòu)成的,機(jī)器唯一能正確執(zhí)行的命令。機(jī)器語(yǔ)言:機(jī)器指令的集合。
例:S=768+12288–1280
機(jī)器碼:
101100000000000000000011000001010000000000110000001011010000000000000101機(jī)器語(yǔ)言特點(diǎn):
難記憶、可讀性差、不易修改,直接面向機(jī)器,所以不同的微處理器可有不同的機(jī)器語(yǔ)言。但編寫(xiě)的程序占用內(nèi)存小,運(yùn)行速度快,能直接對(duì)硬件控制。二、匯編語(yǔ)言的產(chǎn)生匯編語(yǔ)言:是機(jī)器語(yǔ)言便于記憶的書(shū)寫(xiě)格式。例:操作;將寄存器BX中的內(nèi)容送到AX中機(jī)器指令:1000100111011000匯編指令:MOV AX,BX特點(diǎn):兼有機(jī)器語(yǔ)言的優(yōu)點(diǎn),比機(jī)器語(yǔ)言易記易學(xué),但通用性差,隨機(jī)而異。寄存器:是CPU中可以存儲(chǔ)數(shù)據(jù)的器件。機(jī)器語(yǔ)言由0、1組成的二進(jìn)制代碼:1000100111011000匯編語(yǔ)言是機(jī)器語(yǔ)言的助記格式:MOV AX,BX高級(jí)語(yǔ)言是更接近于生活用語(yǔ)的書(shū)寫(xiě)格式:C、BASIC、PASCAL、FORTRAN注:計(jì)算機(jī)只能執(zhí)行機(jī)器指令,所以用非機(jī)器語(yǔ)言寫(xiě)出的程序都必須翻譯成機(jī)器語(yǔ)言后才能被計(jì)算機(jī)執(zhí)行。源程序:用高級(jí)語(yǔ)言(包括匯編)編寫(xiě)的程序。匯編:用匯編程序?qū)⒃闯绦蚍g成機(jī)器代碼的過(guò)程。源程序編譯器機(jī)器語(yǔ)言計(jì)算機(jī)三、匯編語(yǔ)言的組成由以下幾類(lèi)組成:匯編指令(指令性語(yǔ)句):機(jī)器碼的助記符,有對(duì)應(yīng)的機(jī)器碼。(例:MOVAX,BX)偽指令:沒(méi)有對(duì)應(yīng)的機(jī)器碼,由編譯器識(shí)別,沒(méi)有對(duì)應(yīng)的機(jī)器碼。(例:SEGMENT…..)其它符號(hào)(運(yùn)算符):+、-、*、/等,由編譯器識(shí)別,沒(méi)有對(duì)應(yīng)的機(jī)器碼。注:匯編語(yǔ)言的核心是匯編指令,本課程主講80X86指令。數(shù)據(jù)傳送指令:MOV、XCHG、LEA、PUSH、POP算術(shù)運(yùn)算指令:ADD、ADC、INC、SUB、SBB、DEC、CMP、MUL、DIV邏輯運(yùn)算和移位指令:AND、OR、XOR、SAL/SHL、SAR/SHR、ROL、ROR串操作指令:MOVS、CMPS、REP、LODS程序控制指令:JMP、CALL、RET、JNS、JNE、JL、JG、LOOP、INT輸入輸出指令:IN、OUT四、存儲(chǔ)器
存儲(chǔ)器(內(nèi)存)是計(jì)算機(jī)中僅次于CPU的核心部件,由它向CPU提供要運(yùn)行和處理的數(shù)據(jù)。存儲(chǔ)器外部存儲(chǔ)器內(nèi)部存儲(chǔ)器(光盤(pán)、軟盤(pán)、硬盤(pán))(ROM、RAM)CPU數(shù)據(jù)數(shù)據(jù)結(jié)果注:CPU不能直接和磁盤(pán)交換數(shù)據(jù),必須由內(nèi)存來(lái)交換。五、指令和數(shù)據(jù)指令:是告訴計(jì)算機(jī)做什么工作。數(shù)據(jù):是計(jì)算機(jī)(CPU)要處理的對(duì)象。注:指令和數(shù)據(jù)在形式上完全相同,都是一組二進(jìn)制信息,但應(yīng)用上意義不同。例:數(shù)據(jù)89D8H——1000100111011000指令MOV AX,BX——1000100111011000六、存儲(chǔ)單元
將存儲(chǔ)器劃分成若干個(gè)基本的存儲(chǔ)單位,稱(chēng)為存儲(chǔ)單元。給每個(gè)存儲(chǔ)單元從0開(kāi)始順序編號(hào),稱(chēng)為存儲(chǔ)單元的地址。內(nèi)存0123....127100111000110111111100011存儲(chǔ)單元位(bit):計(jì)算機(jī)的最小信息單位,即一位二進(jìn)制數(shù)(0或1)字節(jié)(Byte):1Byte=8bit
一個(gè)存儲(chǔ)單元可以存儲(chǔ)一個(gè)字節(jié)即8bit的信息。1KB=1024B1MB=1024KB1GB=1024MB1TB=1024GB七、CPU對(duì)存儲(chǔ)器的讀寫(xiě)CPU可以從存儲(chǔ)器中取出數(shù)據(jù)進(jìn)行處理(讀)CPU將處理后的數(shù)據(jù)放到存儲(chǔ)器中保存(寫(xiě))思考:CPU如何選擇要讀/寫(xiě)的對(duì)象(寄存器、ROM、RAM、接口)CPU如何找到要處理的數(shù)據(jù)。CPU傳送的三種信息存儲(chǔ)單元的地址(地址信息)選擇芯片、讀或?qū)懙拿睿刂菩畔ⅲ┳x或?qū)憙?nèi)存的數(shù)據(jù)內(nèi)容(數(shù)據(jù)信息)CPU2331089C3B12543210地址總線(xiàn)3數(shù)據(jù)總線(xiàn)控制總線(xiàn)0808讀內(nèi)存命令→機(jī)器碼:101000000000001100000000匯編指令MOV AX,[3]八、地址總線(xiàn)CPU地址總線(xiàn)內(nèi)存數(shù)據(jù)總線(xiàn)控制總線(xiàn)訪(fǎng)問(wèn)地址為12的內(nèi)存單元時(shí),地址總線(xiàn)上傳送的內(nèi)容?一個(gè)CPU有N根地址線(xiàn),則可說(shuō)這個(gè)CPU的地址總線(xiàn)寬度為N??蓪ぶ房臻g為2N個(gè)存儲(chǔ)單元。思考:1個(gè)CPU的尋址空間為1KB,那么它的地址總線(xiàn)的寬度為多少?所能表示的地址范圍為多少?九、數(shù)據(jù)總線(xiàn)
數(shù)據(jù)總線(xiàn)的寬度決定了CPU和外界的數(shù)據(jù)傳送速度,N根數(shù)據(jù)線(xiàn)一次可以傳送N個(gè)bit的數(shù)據(jù)。8088CPU數(shù)據(jù)總線(xiàn)內(nèi)存地址總線(xiàn)控制總線(xiàn)十、控制總線(xiàn)
CPU對(duì)外部器件的控制是通過(guò)控制總線(xiàn)進(jìn)行的,控制總線(xiàn)是一些不同控制線(xiàn)的集合。有多少根控制總線(xiàn),就意味著,這個(gè)CPU提供了對(duì)外部器件的多少種控制,所以控制總線(xiàn)的寬度決定了CPU對(duì)外部器件的控制能力。小結(jié)匯編指令是機(jī)器指令的助記符,同機(jī)器指令一一對(duì)應(yīng)每一種CPU都有自己的匯編指令集CPU可以直接使用的信息在存儲(chǔ)器中存放在存儲(chǔ)器中指令和數(shù)據(jù)沒(méi)有任何區(qū)別,都是二進(jìn)制信息存儲(chǔ)單元從零開(kāi)始順序編號(hào)一個(gè)存儲(chǔ)單元可以存儲(chǔ)8個(gè)bit小結(jié)每一個(gè)CPU芯片都有許多管腳,這些管腳和總線(xiàn)相連。也可以說(shuō),這些管腳引出總線(xiàn)。一個(gè)CPU引出的三種總線(xiàn)的寬度標(biāo)志了這個(gè)CPU的不同方面的性能:(1)地址總線(xiàn)的寬度決定了CPU的尋址能力;(2)數(shù)據(jù)總線(xiàn)的寬度決定了CPU與其它器件進(jìn)行數(shù)據(jù)傳送時(shí)的一次數(shù)據(jù)傳送量;(3)控制總線(xiàn)寬度決定了CPU對(duì)系統(tǒng)中其它器件的控制能力。檢測(cè)點(diǎn)1.1(1)一個(gè)CPU尋址能力為8KB,那么它的地址總線(xiàn)寬度為?(2)8080、8088、80286、80386的地址總線(xiàn)寬度分別為16、20、24、32根,它們的尋址能力?(3)8080、8088、8086、80286、80386的地址總線(xiàn)寬度分別為8、8、16、16、32根,它們一次傳送的數(shù)據(jù)為多少bit?十一、內(nèi)存地址空間(概述)
一個(gè)CPU可以尋到的內(nèi)存單元的范圍稱(chēng)為該CPU的內(nèi)存地址空間。
例:8086CPU的地址總線(xiàn)為20根,所以其內(nèi)存地址空間為00000H—FFFFFH,共有1MB。十二、主板十三、接口卡十四、各類(lèi)存儲(chǔ)器芯片隨機(jī)存儲(chǔ)器(RAM) 用于存放供CPU使用的絕大部分程序和數(shù)據(jù)。裝有BIOS的只讀存儲(chǔ)器(ROM)接口卡上的RAM十五、內(nèi)存地址空間CPU在控制各類(lèi)存儲(chǔ)器時(shí),把它們都當(dāng)作內(nèi)存來(lái)對(duì)待,把它們總的看作一個(gè)由若干存儲(chǔ)單元組成的邏輯存儲(chǔ)器,這個(gè)邏輯存儲(chǔ)器就是我們這里所說(shuō)的內(nèi)存地址空間。CPU內(nèi)存地址空間總線(xiàn)RAM主存儲(chǔ)器ROM系統(tǒng)BIOSRAM顯存ROM顯卡、網(wǎng)卡BIOS第二章寄存器8088/86微處理器的內(nèi)部結(jié)構(gòu)執(zhí)行部分EU總線(xiàn)接口部分BIU返回寄存器組AXBXCXDXSPBPSIDI8位8位AHALAXBHBLBXCHCLCXDHDLDX16位寄存器通用寄存器累加器基址計(jì)數(shù)器數(shù)據(jù)指針寄存器變址寄存器堆棧指針基數(shù)指針源變址目的變址寄存器組IPPSWCSDSSSES控制寄存器段寄存器狀態(tài)標(biāo)志指令指針代碼段數(shù)據(jù)段堆棧段附加段提供相應(yīng)的段地址。一、通用寄存器8086CPU的內(nèi)部寄存器都是16位。將AX、BX、CX、DX四個(gè)寄存器稱(chēng)為通用寄存器。通用寄存器可分為兩個(gè)獨(dú)立的8位寄存器來(lái)用。AX寄存器的邏輯結(jié)構(gòu)15141312111098765432100000000000010010MOVAX,18MOVAX,20000010011100010000016位寄存器分成兩個(gè)8位寄存器的使用情況AX寄存器的邏輯結(jié)構(gòu)1514131211109876543210AX寄存器的邏輯結(jié)構(gòu)15141312111098765432107654321076543210AHAL0100111000100000寄存器寄存器中的數(shù)據(jù)所表示的值A(chǔ)XAHAL010011100010000020000(4E20H)0100111078(4EH)0010000032(20H)一個(gè)8位寄存器所能存儲(chǔ)的數(shù)據(jù)的最大值是多少?一個(gè)16位寄存器所能存儲(chǔ)的最大值又是多少?二、字在寄存器中的存儲(chǔ)字節(jié)(Byte):由8個(gè)比特組成;可以存在8位寄存器中。字(word):由兩個(gè)字節(jié)組成;這兩個(gè)字節(jié)分別稱(chēng)為這個(gè)字的高位字節(jié)和低位字節(jié)。注:一個(gè)16位寄存器中的數(shù)據(jù)即可以看成一個(gè)字型數(shù)據(jù),也可以看作兩個(gè)字節(jié)型數(shù)據(jù)。例:可看成一個(gè)字型數(shù)據(jù)20000存在AX中,也可看成兩個(gè)獨(dú)立的字節(jié)型數(shù)據(jù)分為為78和32。01001110001000000100111000100000三、幾條匯編指令注:在匯編語(yǔ)言中英文字母不區(qū)分大小字。匯編指令控制CPU完成的操作用高級(jí)語(yǔ)言描述MOVAX,18將18送入寄存器AXAX=18MOVAH,78將78送入寄存器AHAH=78ADDAX,8將寄存器AX中的數(shù)值加上8AX=AX+8MOVAX,BX將寄存器BX中的數(shù)據(jù)送入AXAX=BXADDAX,BX將AX和BX中的數(shù)值相加,結(jié)果保存在AX中AX=AX+BX程序段中的指令A(yù)X中的數(shù)據(jù)BX中的數(shù)據(jù)MOVAX,4E20HADDAX,1406HMOVBX,2000HADDAX,BXMOVBX,AXADDAX,BX設(shè)原AX=BX=0000H,分析下列指令執(zhí)行后AX,BX中的數(shù)據(jù)為多少?4E20H0000H6226H0000H6226H2000H8226H2000H8226H8226H8226H+8226H=1044CH AX=?044CH8226H注:當(dāng)所保存的數(shù)據(jù)位數(shù)大于寄存器的位數(shù)時(shí),高位的數(shù)據(jù)會(huì)丟失,稱(chēng)為數(shù)據(jù)溢出。程序段中的指令A(yù)X中的數(shù)據(jù)BX中的數(shù)據(jù)MOVAX,001AHMOVBX,0026HADDAL,BLADDAH,BLADDBH,ALMOVAH,0ADDAL,85HADDAL,93H001AH 0000H001AH 0026H0040H 0026H2640H 0026H2640H 4026H0040H 4026H00C5H 4026H0058H 4026H注:當(dāng)通用寄存器作為8位寄存器使用時(shí),低8位和高8位相當(dāng)于兩個(gè)獨(dú)立的寄存器,它們之間沒(méi)有直接關(guān)系,不能產(chǎn)生進(jìn)位。ADDAX,85HAX=?ADDAX,93HAX=?注意:
在進(jìn)行數(shù)據(jù)傳送或運(yùn)算時(shí),要注意指令的操作數(shù)的位數(shù)要匹配。例:數(shù)據(jù)位數(shù)不匹配的指令 MOV AX,BL MOV BH,AX MOV AL,20000 ADD AL,100H練習(xí):使用4條指令計(jì)算2的4次方四、物理地址
我們給每個(gè)存儲(chǔ)單元給了唯一的一個(gè)編號(hào),這個(gè)編號(hào)就是這個(gè)內(nèi)存單元的物理地址。在8086/8088CPU中對(duì)外有20根地址線(xiàn)尋址,所以其系統(tǒng)中的內(nèi)存單元物理地址為20位的地址編號(hào)。地址總線(xiàn)內(nèi)存......20根線(xiàn),每根可表0/1,總共可表多少數(shù)?即為地址編號(hào)總數(shù)。存儲(chǔ)單元按序編號(hào),即為其物理地址。00000HFFFFFH是否給我們這樣一個(gè)概念?尋址功能輸入:20位二進(jìn)制串(地址)輸出:8/16位二進(jìn)制串(數(shù)值)8086具有20根地址總線(xiàn),16根數(shù)據(jù)總線(xiàn)五、16位結(jié)構(gòu)的CPU16位機(jī):運(yùn)算器一次最多可以處理16位的數(shù)據(jù)。寄存器的最大寬度為16位;寄存器和運(yùn)算器之間的通路為16位。六、8086CPU給出物理地址的方法1)CPU中的段寄存器(CS)提供段地址,指令指針寄存器(IP)提供偏移地址;2)段地址和偏移地址通過(guò)內(nèi)部總線(xiàn)送入地址加法器;3)地址加法器將兩個(gè)16位地址合成一個(gè)20位的物理地址;4)地址加法器將20位的物理地址送輸入輸出控制電路;5)輸入輸出控制電路將20位物理地址送上外部地址總線(xiàn);6)地址總線(xiàn)將20位物理地址送入內(nèi)存,尋址。其他部件地址加法器輸入輸出控制電路偏移地址段地址16位物理20位內(nèi)存20位物理地址8位數(shù)據(jù)總線(xiàn)16位控制總線(xiàn)CPU物理地址=段地址×16+偏移地址=段地址(左移4位)+偏移地址8088CPU訪(fǎng)問(wèn)內(nèi)存單元工作過(guò)程
訪(fǎng)問(wèn)地址為123C8H的內(nèi)存單元時(shí),地址加法器的工作過(guò)程(數(shù)據(jù)皆為十六進(jìn)制表示)CSIP寄存器組地址加法器1230H00C8H相關(guān)部件提供段地址和偏移地址段地址和偏移地址送入地址加法器123000C8段地址左移4位(×
16)1230000C812300+00C8123C8段地址+偏移地址形成20位物理地址輸出20位物理地址123C8H地址加法器的工作過(guò)程段地址:×16=左移4位(2進(jìn)制)=左移1位(16進(jìn)制)左移位數(shù)二進(jìn)制十六進(jìn)制十進(jìn)制010B2H22×201100B4H42×2121000B8H82×22310000B10H162×234100000B20H322×24一個(gè)數(shù)據(jù)的二進(jìn)制形式左移N位,相當(dāng)于該數(shù)據(jù)乘以2N加法器左移4位相當(dāng)于乘以24(16)七、“段地址×16+偏移地址=物理地址”的本質(zhì)含義
本質(zhì)含義:CPU在訪(fǎng)問(wèn)內(nèi)存時(shí),用一個(gè)基礎(chǔ)地址(段地址×16)和一個(gè)相對(duì)于基礎(chǔ)地址的偏移地址相加,給出了內(nèi)存單元的物理地址。八、段的概念
段是我們?yōu)榱斯芾韮?nèi)存而引入的一個(gè)虛擬的概念,我們可以將內(nèi)存地址連續(xù)、起始地址為16的倍數(shù)的一組內(nèi)存單元看作一個(gè)段來(lái)管理,但事實(shí)上,內(nèi)存并沒(méi)有被真正劃分成段。注:段地址×16必然是16的倍數(shù),所以一個(gè)段的起始地址一定是16的倍數(shù)(即:XXXX0H);偏移地址為16位,所以一個(gè)段的長(zhǎng)度最大為64KB。思考:觀察下面的地址物理地址 段地址 偏移地址21F60H 2000H 1F60H 2100H 0F60H 21F0H 0060H 21F6H 0000H 1F00H 2F60HCPU可以用不同的段地址和偏移地址形成同一個(gè)物理地址。從這里可看出,分段僅僅是一個(gè)虛擬的概念。如果給定一個(gè)段地址,僅通過(guò)變化偏移地址來(lái)進(jìn)行尋址,最多可定位多少內(nèi)存單元?九、段寄存器 在CPU中提供段地址的寄存器符號(hào)名稱(chēng)作用配合寄存器CS代碼段提供(程序、指令)段地址IPDS數(shù)據(jù)段用于存放數(shù)據(jù)的存儲(chǔ)器段的起始地址。(包含程序使用的大部分?jǐn)?shù)據(jù)的存儲(chǔ)區(qū)域)SS堆棧段定義堆棧的存儲(chǔ)區(qū)SPES附加段存放附加存儲(chǔ)器段的段地址。常用于存放數(shù)據(jù)或串操作中作目標(biāo)數(shù)據(jù)段十、CS和IPCS—代碼段:提供當(dāng)前要執(zhí)行的指令的段地址。IP—指令指針寄存器:指向當(dāng)前要執(zhí)行的指令的偏移地址。 由CS和IP分別提供一個(gè)16位的段地址和偏移地址,經(jīng)地址加法器合成一個(gè)20位的物理地址,該地址為當(dāng)前要執(zhí)行的指令所在的位置(CS:IP)。AXBX其他部件CSIP指令緩沖器執(zhí)行控制器地址加法器輸入輸出控制電路2000A20009D8200080120007D820006892000500200040320003BB2000201200012320000B8CPU內(nèi)存地址總線(xiàn)數(shù)據(jù)總線(xiàn)Movax,0123HMovbx,0003HMovax,bxAddax,bx若當(dāng)前CPU中的狀態(tài)為:CS=2000,IP=00002000000020000200002000020000B82301B82301000100020003000320003B8230120003B823012000320003BB03000123BB0300000620006B9D8000800032000801D8000A00032000A0006AXBX其他部件CSIP指令緩沖器執(zhí)行控制器地址加法器輸入輸出控制電路2000A20009D8200080120007D820006892000500200040320003BB2000201200012320000B8CPU內(nèi)存地址總線(xiàn)數(shù)據(jù)總線(xiàn)Movax,0123HMovbx,0003HMovax,bxAddax,bx(1)從CS:IP指向內(nèi)存單元讀取指令,讀取的指令進(jìn)入指令緩沖器;IP+nN=所取指令的長(zhǎng)度。(2)IP=IP+N,從而指向下一條指令;(3)執(zhí)行和處理取到的指令,重復(fù)步驟(1)由CS:IP指向CPU將要執(zhí)行的指令所在的物理地址,取到指令后,IP會(huì)自動(dòng)增加N指向下一條指令所在的位置;從而使計(jì)算機(jī)能夠自動(dòng)連續(xù)的執(zhí)行一個(gè)完整的程序。十一、修改CS、IP的指令若想同時(shí)修改CS、IP的內(nèi)容,可用jmp 段地址:偏移地址指令例:jmp 2AE3:3則CS=2AE3H,IP=0003H若只修改IP的內(nèi)容,可用jmp某一合法寄存器 指令例:jmpAX則執(zhí)行后IP=AX注意:CS和IP不充許直接賦值。MOVCS,1000HMOVCS,AXMOVIP,2000HA6622B8E3FFD88B0000B80123B820005H20006H20004HJmp1000:320003H20009HMovcx,ax20008H20007H20002H20001HMovax,6622H20000H10009HJmpbx10008H10007HMovbx,ax10006H10005H10004HMovax,0000H10003H10002H10001HMovax,0123H10000H已知:CPU的初始狀態(tài):CS=2000H,IP=0000H,內(nèi)存單元情況見(jiàn)右表,試分析指令執(zhí)行序列。MOVAX,6622HJMP1000:3MOVAX,0000H2000:00002000:00031000:0003MOVBX,AX1000:0006JMPBX1000:0008AX=6622HBX=0000HAX=6622HBX=0000HAX=0000HBX=0000HAX=0000HBX=0000HAX=0000HBX=0000H1000:0000MOVAX,0123HAX=0123HBX=0000H1000:0003十二、代碼段段:我們可以根據(jù)需要將內(nèi)存中從XXXXH:0000H開(kāi)始到XXXXH:YYYYH之間一段連續(xù)的內(nèi)存空間做為一個(gè)段來(lái)使用。代碼段:用來(lái)存放指令的段稱(chēng)為代碼段,代碼段由CS:IP來(lái)確定。小結(jié)16位CPU的內(nèi)部結(jié)構(gòu)寄存器段地址、偏移地址、物理地址CPU執(zhí)行指令的過(guò)程寄存器是CPU中存儲(chǔ)信息的器件8086CPU中的寄存器都為16位通用寄存器AX,BX,CX,DX都可分兩個(gè)獨(dú)立的8位寄存器來(lái)使用。段寄存器是CPU中提供段地址的寄存器。其中CS:IP始終指向CPU將執(zhí)行指令的物理地址。作業(yè)上機(jī)練習(xí)一(見(jiàn)Q群共享)第三章寄存器(內(nèi)存訪(fǎng)問(wèn))AXBX其他部件CSIP指令緩沖器執(zhí)行控制器地址加法器輸入輸出控制電路2000A20009D8200080120007D820006892000500200040320003BB2000201200012320000B8CPU內(nèi)存地址總線(xiàn)數(shù)據(jù)總線(xiàn)Movax,0123HMovbx,0003HMovax,bxAddax,bx一、內(nèi)存中字的存儲(chǔ)110001111111011000111001內(nèi)存單元寄存器的邏輯結(jié)構(gòu)1514131211109876543210字單元:即存放一個(gè)字型數(shù)據(jù)(16位)的內(nèi)存單元,由兩個(gè)地址連續(xù)的內(nèi)存單元組成。高地址內(nèi)存單元中存放字型數(shù)據(jù)的高位字節(jié),低地址內(nèi)存單元中存放字型數(shù)據(jù)的低位字節(jié)。0110111110011100字單元020H14EH212H300H45例:1)0地址單元中存放的字節(jié)型數(shù)據(jù)是多少?2)0地址字單元中存放的字型數(shù)據(jù)是多少?3)2地址單元中存放的字節(jié)型數(shù)據(jù)是多少?4)2地址字單元中存放的字型數(shù)據(jù)是多少?5)1地址字單元中存放的字型數(shù)據(jù)是多少?二、DS和[address]DS—數(shù)據(jù)段寄存器:提供數(shù)據(jù)所在內(nèi)存的段地址。[address]:表示一個(gè)偏移地址為address的內(nèi)存單元。例:[1234H]指偏移地址為1234H的內(nèi)存單元。
[AX]指偏移地址為(AX)的內(nèi)存單元。10000H20H10001H4EH10002H12H10003H00H10004H10005HMOV BX,1000HMOV DS,BXMOV AL,[0000H]CPU要存取內(nèi)存中的數(shù)據(jù)時(shí),段地址默認(rèn)在DS寄存器中,偏移地址在指令中給出。通用寄存器AX、BX、CX、DX、BP、SP、SI、DI、AL、AH、BL、BH、CL、CH、DL、DH存儲(chǔ)器立即數(shù)段寄存器CS、DSES、SSCS只能作源操作數(shù)MOV AX,1234HMOV BL,12HMOV CX,03HMOV [0],12HMOV [0200H],1234HMOV [AX],03HMOV AX,BXMOV DX,AXMOV BL,ALMOV AX,[0]MOV [0],AXMOV BL,[AX]MOV AX,DSMOV DS,AXMOV AX,CSMOV CS,AX
MOV DS,[0]MOV [1],ESMOV [AX],CS判斷下列指令是否正確,若錯(cuò)誤,為什么?1、MOVCL,1000H2、MOV AL,[1000H]3、MOV[BX],[SI]4、MOVAH,BH5、MOVAX,[SI]6、MOV 1234H,BX7、MOVCL,AX8、MOVCS,AX9、MOV DS,CS問(wèn)題:試寫(xiě)幾條指令,將AL中的數(shù)據(jù)保存到內(nèi)存單元12345H中。 MOV BX,1000H MOV DS,BX MOV [2345H],AL三、字的傳送MOV BX,1000HMOV DS,BXMOV AX,[0] ;將1000:0處的字型數(shù)據(jù)送入AX中MOV [0],CX ;將CX中的16位數(shù)據(jù)送到1000:0處MOV BH,[0]
;將1000:0處的字節(jié)型數(shù)據(jù)送入BH當(dāng)向內(nèi)存單元中存取數(shù)據(jù)時(shí),若操作的為字節(jié)型數(shù)據(jù)則一次讀寫(xiě)一個(gè)內(nèi)存單元,若為字型數(shù)據(jù)則按低地址為低8位,高地址為高8位的原則存取數(shù)據(jù)。例:內(nèi)存單元中的情況如圖所示,寫(xiě)出下面指令執(zhí)行后寄存器AX,BX,CX中的值。
MOV AX,1000H MOV DS,AX MOV AX,[0] MOV BX,[2] MOV CX,[1] ADD BX,[1] ADD CX,[2]10000H23H10001H11H10002H22H10003H66HAX=1000HDS=1000HAX=1123HBX=6622HCX=2211HBX=8833HCX=8833H例:內(nèi)存單元中的情況如圖所示,寫(xiě)出下面指令執(zhí)行后內(nèi)存中的值。
MOV AX,1000H MOV DS,AX MOV AX,11316 MOV [0],AX MOV BX,[0] SUB BX,[2] MOV [2],BX10000H23H10001H11H10002H22H10003H11HAX=1000HDS=1000HAX=2C34HBX=2C34HBX=1B12H34H2CH12H1BH四、 MOV、ADD、SUB指令一條指令包括如下內(nèi)容:1)操作碼:指令所執(zhí)行的操作。2)操作數(shù):指令操作的對(duì)象,包括操作數(shù)的來(lái)源,操作結(jié)果的去向。操作對(duì)象通常為存儲(chǔ)器地址,寄存器或立即數(shù)。例:MOVAX,03HMOV操作碼操作數(shù)AX,03H目的操作數(shù)AX源操作數(shù)03H通用寄存器AX、BX、CX、DX、BP、SP、SI、DI、AL、AH、BL、BH、CL、CH、DL、DH存儲(chǔ)器立即數(shù)段寄存器CS、DSES、SSMOV AX,8MOV AX,BXMOV AX,[0]MOV [0],AXMOV DS,AXCS只能作源操作數(shù)MOV AX,DSMOV AX,CSMOV [0],DSMOV [0],CSMOV DS,[0]MOV CS,AXADD DS,AXADD DS,[0]五、 數(shù)據(jù)段XXXX001H12H23H34H45H56H67H78H89H9AHABH123B0H123B1H123B2H123B3H123B4H123B5H123B6H123B7H123B8H123B9H123BAHDS[address]地址加法器MOV AX,123BHMOV DS,AXMOV AL,0ADD AL,[0]ADD AL,[1]ADD AL,[2]六、棧(堆棧)棧:是具有特殊的訪(fǎng)問(wèn)方式的存儲(chǔ)空間。棧有兩個(gè)基本操作:入棧;出棧。DCBADCBADCBA七、CPU提供的棧機(jī)制、PUSH和POP指令堆棧指令PUSH堆棧壓入指令格式:
PUSHOP(操作數(shù))功能:將OP中的內(nèi)容放入堆棧段中POP堆棧彈出指令格式:POPOP功能:將堆棧段中的內(nèi)容彈出到OP。說(shuō)明:OP可以是段寄存器(CS除外)、通用寄存器或內(nèi)存的字單元。PUSH AXPUSH DSPUSH[0]POP AXPOP DSPOP[0]10000H10009H1000AH1000BH1000CH1000DH1000EH1000FH設(shè)現(xiàn)有10000H—1000FH為一棧段MOV AX,0123HPUSHAX0123MOVBX,2266HPUSHBX2266MOVCX,1122HPUSHCX1122POPAXAX=1122HPOPBXBX=2266HPOPCXCX=0123HCPU如何知道堆棧段在哪里?執(zhí)行PUSH、POP指令時(shí),CPU如何找到要操作的位置?CPU執(zhí)行指令——CS:IPCPU讀寫(xiě)內(nèi)存數(shù)據(jù)—DS:[address]CPU進(jìn)行堆棧操作—SS:SPSS—堆棧段寄存器:指定堆棧段的段地址SP—堆棧指針寄存器:指向棧頂?shù)钠频刂啡我鈺r(shí)刻,SS:SP指向棧頂?shù)刂贰USH入棧過(guò)程10000H1000BH1000CH1000DH1000EH231000FH01當(dāng)前:SS=1000H,SP=000EH,AX=2266HPUSHAX棧頂66棧頂1)SP=SP-2,SS:SP指向當(dāng)前棧頂前面的單元,以當(dāng)前棧頂前面的單元為新的棧頂。222)將AX中的內(nèi)容送入SS:SP指向的內(nèi)存單元處,SS:SP此時(shí)指向新棧頂。POP出棧過(guò)程10000H1000BH1000CH1000DH1000EH231000FH01POPAX棧頂66棧頂1)將SS:SP指向的內(nèi)存單元處的數(shù)據(jù)送入AX中;222)SP=SP+2,SS:SP指向當(dāng)前棧頂下面的單元,以當(dāng)前棧頂下面的單元為新的棧頂。當(dāng)棧空時(shí),棧頂?shù)奈恢脼槎嗌??八、棧頂超界的?wèn)題10000H1000BH1000CH1000DH1000EH1000FH10010H??臻gSS:SP768798235645342312當(dāng)棧滿(mǎn)時(shí)再執(zhí)行PUSH指令入棧,或在??諘r(shí)執(zhí)行POP指令出棧,都將發(fā)生棧頂超界的問(wèn)題。在8086CPU中沒(méi)有預(yù)防棧超界的機(jī)制,所以程序員必須自己考慮,防止棧超界。九、PUSH、POP指令例:編程,將10000H—1000FH這段空間當(dāng)作棧,初始狀態(tài)棧是空的,將AX,BX,DS中的數(shù)據(jù)入棧。MOVAX,1000HMOVSS,AXMOVSP,0010HPUSHAXPUSHBXPUSHDS例:編程:將10000H—1000FH這段空間當(dāng)作棧,初始狀態(tài)是空的;設(shè)置AX=001AH,BX=001BH;將AX,BX中的數(shù)據(jù)入棧;然后將AX、BX清零;從棧中恢復(fù)AX、BX原來(lái)的內(nèi)容;MOVAX,1000MOVSS,AXMOVSP,0010HMOVAX,001AHMOVBX,001BHPUSHAXPUSHBXSUBAX,AXSUBBX,BXPOPBXPOPAX例:編程將10000H—1000FH這段空間作棧,初始狀態(tài)棧是空的;設(shè)置AX=002AH,BX=002BH;利用棧,交換AX和BX中的數(shù)據(jù)。MOVAX,1000HMOVSS,AXMOVSP,0010HMOVAX,002AHMOVBX,002BHPUSHAXPUSHBXPOPAXPOPBX例:如果要將10000H處寫(xiě)入字型數(shù)據(jù)2266H,可以用以下指令完成:
MOVAX,1000H MOVDS,AX MOVAX,2266H MOV[0],AX補(bǔ)全下面的代碼,使它能夠完成同樣的功能————————————————————————MOVAX,2266HPUSHAX十、棧段分析:如果我們將10000H—1FFFFH這段空間作棧段,初始狀態(tài)棧是空的,此時(shí)SS=1000H,SP=?一個(gè)棧段最大可以設(shè)為多少?作業(yè):檢測(cè)點(diǎn)3.1(1)、(2)檢測(cè)點(diǎn)3.2(1)、(2)第4章第1個(gè)程序一個(gè)源程序從寫(xiě)出到執(zhí)行的過(guò)程程序加載并運(yùn)行的原理程序執(zhí)行過(guò)程的跟蹤、調(diào)試一、一個(gè)源程序從寫(xiě)出到執(zhí)行的過(guò)程第一步:編寫(xiě)匯編源程序產(chǎn)生文本文件(.txt)第二步:對(duì)源程序編譯產(chǎn)生目標(biāo)文件(.obj)第三步:對(duì)目標(biāo)文件連接產(chǎn)生可執(zhí)行文件(.exe)第四步:執(zhí)行可執(zhí)行文件程序二、源程序
匯編源程序:用匯編語(yǔ)言寫(xiě)出的程序代碼ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADDAX,BX ADDAX,AX MOV AX,4C00H INT 21HCODESG ENDSEND匯編指令:告訴計(jì)算機(jī)如何處理數(shù)據(jù)的命令。例:MOVADDSUBJMPPUSHPOP注:每條匯編指令都有一一對(duì)應(yīng)的機(jī)器代碼,編譯后產(chǎn)生對(duì)應(yīng)的機(jī)器碼,最終被CPU執(zhí)行。1、偽指令:不要求CPU執(zhí)行具體操作,匯編時(shí)不產(chǎn)生機(jī)器碼,僅僅給匯編程序提供相應(yīng)的匯編信息。(程序中段的信息、堆棧的大小、調(diào)用的數(shù)據(jù)庫(kù))ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADD
AX,BX ADDAX,AX MOV AX,4C00H INT 21HCODESG ENDSEND匯編指令偽指令標(biāo)號(hào)(1)段定義偽指令SEGMENT和ENDS
一個(gè)完整的源程序可由3個(gè)段組成:堆棧段、數(shù)據(jù)段、代碼段。其中堆棧段和數(shù)據(jù)段可以沒(méi)有,但代碼段是必須的。SEGMENT:定義一個(gè)段開(kāi)始。(注:一個(gè)段必須有一個(gè)名稱(chēng)來(lái)標(biāo)識(shí)。)ENDS:說(shuō)明一個(gè)段的結(jié)束,和SEGMENT成對(duì)使用。格式:
段名SEGMENT段名ENDSASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADD
AX,BX ADDAX,AX MOV AX,4C00H INT 21HCODESG ENDSEND代碼段(CODE)、數(shù)據(jù)段(DATA)、堆棧段(STACK)(2)匯編結(jié)束偽指令END格式:
END[標(biāo)號(hào)]功能:表示源程序到此結(jié)束。說(shuō)明:一個(gè)源程序必須有且只能有一個(gè)END語(yǔ)句,一般放在源程序的最后一行。ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADD
AX,BX ADDAX,AX MOV
AX,4C00H INT21HCODESG ENDSEND(3)ASSUME段分配偽指令格式:
ASSUME段寄存器:段名[,段寄存器:段名,…] 用于說(shuō)明源程序中定義的段或組由哪個(gè)寄存器去尋址,即建立寄存器與段間的對(duì)應(yīng)關(guān)系。例:
ASSUMECS:CODE,DS:DATA,SS:STACKCODESEGMENT MOVAX,1234H MOVDS,AXCODE ENDS一般放在源程序首行或代碼段前ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADD
AX,BX ADDAX,AX MOV
AX,4C00H INT21HCODESG ENDSEND2、源程序中的“程序”ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADD
AX,BX ADDAX,AX MOVAX,4C00H INT 21HCODESG ENDSEND描述信息B82301BB560403C303C0B8004CCD21編譯連接MOVAX,0123HMOVBX,0456HADD
AX,BXADDAX,AXMOV AX,4C00HINT 21H3、標(biāo)號(hào):代表某一存儲(chǔ)單元地址的名字。字母:A~Z
數(shù)字:0~9特殊字符:?.@_$例:BINASC:MOVAX,BX S2:
MOVAX,BX BIG?:MOVAX,BX注意:數(shù)字不能作名稱(chēng)的第一個(gè)字符。圓點(diǎn)只能用作第一個(gè)字符,標(biāo)號(hào)最長(zhǎng)為31個(gè)字符。ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADD
AX,BX ADDAX,AX MOV
AX,4C00H INT21HCODESG ENDSEND4、匯編語(yǔ)言源程序的結(jié)構(gòu)
一般來(lái)說(shuō),一個(gè)完整的匯編源程序應(yīng)由三個(gè)程序段組成,即代碼段、數(shù)據(jù)段和堆棧段,每個(gè)段都以SEGMENT開(kāi)始,以ENDS結(jié)束,代碼段包含程序要執(zhí)行的指令;堆棧段用來(lái)在內(nèi)存中建立一個(gè)堆棧區(qū);數(shù)據(jù)段用來(lái)在內(nèi)存中建立一個(gè)適當(dāng)容量的工作區(qū),以存放程序中所需的數(shù)據(jù)。注意:一個(gè)源程序中,代碼段是必須的,而數(shù)據(jù)段和堆棧段可以沒(méi)有或有其中一個(gè)。段定義時(shí)一般最后定義代碼段。4、匯編語(yǔ)言源程序的結(jié)構(gòu)
一般來(lái)說(shuō),一個(gè)完整的匯編源程序應(yīng)由三個(gè)程序段組成,即代碼段、數(shù)據(jù)段和堆棧段,每個(gè)段都以SEGMENT開(kāi)始,以ENDS結(jié)束,代碼段包含程序要執(zhí)行的指令;堆棧段用來(lái)在內(nèi)存中建立一個(gè)堆棧區(qū);數(shù)據(jù)段用來(lái)在內(nèi)存中建立一個(gè)適當(dāng)容量的工作區(qū),以存放程序中所需的數(shù)據(jù)。注意:一個(gè)源程序中,代碼段是必須的,而數(shù)據(jù)段和堆棧段可以沒(méi)有或有其中一個(gè)。段定義時(shí)一般最后定義代碼段。ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTACK SEGMENT DB 500 DUP(0)STACK ENDSDATA SEGMENTDATA ENDSCODE SEGMENTMAIN: PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX
CODE ENDS END MAIN定義堆棧段定義數(shù)據(jù)段定義代碼段SEGMENTENDSSEGMENTENDSSEGMENTENDSEND MAINASSUME段分配段結(jié)束例:編程運(yùn)算235、程序返回ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADD
AX,BX ADDAX,AX
MOV
AX,4C00H INT21HCODESG ENDSEND6、語(yǔ)法錯(cuò)誤和邏輯錯(cuò)誤語(yǔ)法錯(cuò)誤:程序在編譯時(shí)被編譯器發(fā)現(xiàn)的錯(cuò)誤。邏輯錯(cuò)誤:源程序編譯后運(yùn)行時(shí)發(fā)生的錯(cuò)誤。一個(gè)源程序執(zhí)行的過(guò)程三、編寫(xiě)匯編源程序使用工具:可使用各種文本編輯工具(記事本、寫(xiě)字板、WORD等),我們使用DOS下的EDIT文本編輯器。功能:產(chǎn)生一個(gè)存儲(chǔ)源程序的文本文件。使用方法:在DOS下運(yùn)行EDIT.EXE程序。1、C:\EDIT2、輸入?yún)R編源程序并保存為.asm文件。四、對(duì)源程序進(jìn)行編譯使用工具:使用MASM5.0編譯器功能:使用編譯器對(duì)源程序文件進(jìn)行編譯,生成包含機(jī)器代碼的目標(biāo)文件(.obj)。使用方法:在DOS下運(yùn)行MASM.EXE程序。1、C:\MASM\MASM.EXE2、輸入要進(jìn)行編譯的源程序文件路徑及名稱(chēng)。3、輸入進(jìn)行編譯后產(chǎn)生的目標(biāo)文件保存的路徑及名稱(chēng)。4、輸入列表文件名:5、輸入交叉文件名:五、對(duì)目標(biāo)文件進(jìn)行連接使用工具:使用LINK.EXE連接器功能:對(duì)目標(biāo)文件進(jìn)行連接,從而得到一個(gè)可執(zhí)行文件.EXE。使用方法:在DOS下運(yùn)行LINK.EXE程序。1、C:\MASM\LINK.EXE2、輸入要進(jìn)行連接的目標(biāo)文件路徑及名稱(chēng)。3、輸入進(jìn)行連接后產(chǎn)生的可執(zhí)行文件.Exe保存的路徑及名稱(chēng)。4、輸入映像文件名:5、輸入庫(kù)文件名:連接的作用:當(dāng)源程序較大時(shí),編譯器會(huì)將源程序文件分成多個(gè)部分來(lái)編譯,每個(gè)源程序編譯成為目標(biāo)文件后,再用連接程序?qū)⑺鼈冞B接在一起,生成一個(gè)可執(zhí)行文件。程序中調(diào)用了某個(gè)庫(kù)文件中的內(nèi)容時(shí),需要將這個(gè)庫(kù)文件和該程序生成的目標(biāo)文件連接在一起。一個(gè)源程序編譯后,得到了存有機(jī)器碼的目標(biāo)文件,目標(biāo)文件中有的內(nèi)容不能直接生成可執(zhí)行文件,必須通過(guò)連接程序?qū)⑦@些內(nèi)容處理為最終可執(zhí)行的信息。六、以簡(jiǎn)化的方式進(jìn)行編譯和連接忽略中間文件,將產(chǎn)生的目標(biāo)文件和可執(zhí)行文件保存在當(dāng)前路徑下。C:\MASM\MASMXXX;C:\MASM\LINKXXX;七、可執(zhí)行文件.exe的執(zhí)行八、可執(zhí)行文件中的程序裝入內(nèi)存并運(yùn)行的原理CPU內(nèi)存硬盤(pán)DATASEGMENTDATAENDSCODESEGMENTCODEENDScommand操作系統(tǒng)的外殼操作系統(tǒng)是由多個(gè)功能模塊組成的龐大、復(fù)雜的軟件系統(tǒng)。任何通用的操作系統(tǒng),都要提供一個(gè)稱(chēng)為外殼(shell)的程序,用戶(hù)使用這個(gè)程序來(lái)操作計(jì)算機(jī)系統(tǒng)進(jìn)行工作。DOS中有一個(gè)程序,在DOS中稱(chēng)為命令解釋器,也就是DOS系統(tǒng)的外殼。DOS啟動(dòng)時(shí),先完成其他重要的初始化工作,然后運(yùn)行command,command運(yùn)行后,在屏幕上顯示出“C:\”,然后等待用戶(hù)的輸入。如果用戶(hù)要執(zhí)行一個(gè)程序,則輸入該程序的可執(zhí)行文件的名稱(chēng),command首先根據(jù)文件名找到可執(zhí)行文件,然后將這個(gè)可執(zhí)行文件中的程序加載入內(nèi)存,設(shè)置CS:IP指向程序的入口。此后,command暫停運(yùn)行,由CPU運(yùn)行程序。程序運(yùn)行結(jié)束后,返回到command中。九、程序執(zhí)行過(guò)程的跟蹤使用工具:Debug使用方法:在DOS下運(yùn)行DEBUG.EXE程序。1、C:\DEBUGxxx.EXE在DOS中可執(zhí)行文件.EXE中程序加載的過(guò)程內(nèi)存xxxx:0000PSPxxxx+10h:0000程序1、找到一段起始地址為xxxx:0000的容量足夠的空閑內(nèi)存區(qū)。2、在這段內(nèi)存區(qū)的前256個(gè)字節(jié)中,創(chuàng)建一個(gè)稱(chēng)為程序段前綴(PSP)的數(shù)據(jù)區(qū),DOS要利用PSP來(lái)和被加載的程序進(jìn)行通信;3、從xxxx+10H:0開(kāi)始,將程序裝入,程序的地址被設(shè)為xxxx+10H:04、將該內(nèi)存區(qū)的段地址存入DS中,初始化其他相關(guān)寄存器后,設(shè)置CS:IP指向程序入口。注意:PSP區(qū)和程序區(qū)雖然物理地址連續(xù),但為更好的區(qū)分,DOS將它們劃分到不同的段中。程序加載后,ds=xxxx為程序加載的段地址。數(shù)據(jù)區(qū)堆棧區(qū)代碼區(qū)1、編程(保存在test.asm)assumecs:codedatasegmentdboffsetstartdataendscodesegmentstart:movax,data movds,ax movbx,[0] jmpbxcodeendsendstart示例一2、匯編Masmtest.asm——生成test.obj3、連接linktest——生成test.exe4、調(diào)試debugtest.exe——使用實(shí)驗(yàn)一命令將AL中的數(shù)據(jù)保存到內(nèi)存單元12345H中
assumecs:codecodesegmentstart:movax,1234h movds,ax movbx,5 moval,12 mov[bx],al;bx能否換成其它寄存器?codeendsendstartMasm匯編器中mov[5],al會(huì)出現(xiàn)錯(cuò)誤注意:Debug和masm有些不同,在Debug可用的,masm
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 5G+AI慢病隨訪(fǎng)的實(shí)時(shí)干預(yù)機(jī)制
- 3D打印輸尿管支架的尿液流速優(yōu)化
- 2型糖尿病口服藥聯(lián)合治療策略
- 2025年瀏陽(yáng)市金陽(yáng)醫(yī)院第三批公開(kāi)招聘編外合同制人員備考題庫(kù)及答案詳解參考
- 2025年中國(guó)國(guó)際貨運(yùn)航空股份有限公司華東大區(qū)應(yīng)屆畢業(yè)生招聘?jìng)淇碱}庫(kù)及答案詳解1套
- 采購(gòu)安裝設(shè)備合同(15份范本)
- 2025年中鐵十一局集團(tuán)有限公司專(zhuān)業(yè)人才招聘?jìng)淇碱}庫(kù)完整參考答案詳解
- 理解含義課件
- 差價(jià)談判話(huà)術(shù)技巧
- 區(qū)域管理面試實(shí)戰(zhàn)攻略
- 內(nèi)蒙古自治區(qū)烏蘭察布市集寧區(qū)2025-2026學(xué)年九年級(jí)上學(xué)期12月期末考試(中考診斷)化學(xué)試卷(含答案)
- 2025年廣東省第一次普通高中學(xué)業(yè)水平合格性考試(春季高考)英語(yǔ)試題(含答案詳解)
- 2026年日歷表(每月一頁(yè)、可編輯、可備注)
- 2025年大一上數(shù)學(xué)分析期末考試題及答案
- 五金購(gòu)銷(xiāo)合同范文8篇
- 心理戰(zhàn)法律戰(zhàn)輿論戰(zhàn)課件
- 《公路橋涵施工技術(shù)規(guī)范》JTGT3650-2020
- 《老年患者壓瘡護(hù)理的研究現(xiàn)狀》3100字
- 教學(xué)課件-律師實(shí)務(wù)
- 人工智能+-智能圖像處理課件
- 保險(xiǎn)公司早會(huì)-保險(xiǎn)激勵(lì)專(zhuān)題教學(xué)課件
評(píng)論
0/150
提交評(píng)論