




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第第4 4章章教學(xué)重點(diǎn)教學(xué)重點(diǎn)匯編語言源程序格式與開發(fā)匯編語言源程序格式與開發(fā)常量、變量和標(biāo)號常量、變量和標(biāo)號匯編語言程序設(shè)計(jì)方法匯編語言程序設(shè)計(jì)方法順序程序設(shè)計(jì)順序程序設(shè)計(jì)分支程序設(shè)計(jì)分支程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)子程序設(shè)計(jì)子程序設(shè)計(jì)1、匯編語言簡介匯編語言簡介匯編語言是一種以處理器指令系統(tǒng)為基礎(chǔ)的低級匯編語言是一種以處理器指令系統(tǒng)為基礎(chǔ)的低級程序設(shè)計(jì)語言,它采用助記符表達(dá)指令操作碼,程序設(shè)計(jì)語言,它采用助記符表達(dá)指令操作碼,采用標(biāo)識符號表示指令操作數(shù)采用標(biāo)識符號表示指令操作數(shù)利用匯編語言編寫程序的主要優(yōu)點(diǎn)是可以直接、利用匯編語言編寫程序的主要優(yōu)點(diǎn)是可以直接、有效地控制計(jì)算機(jī)硬件,因而
2、容易創(chuàng)建代碼序列有效地控制計(jì)算機(jī)硬件,因而容易創(chuàng)建代碼序列短小、運(yùn)行快速的可執(zhí)行程序短小、運(yùn)行快速的可執(zhí)行程序在有些應(yīng)用領(lǐng)域,匯編語言的作用是不容置疑和在有些應(yīng)用領(lǐng)域,匯編語言的作用是不容置疑和無可替代的無可替代的匯編程序設(shè)計(jì)的過程是與其他高級語言程序設(shè)計(jì)匯編程序設(shè)計(jì)的過程是與其他高級語言程序設(shè)計(jì)大致相同大致相同一、源程序的構(gòu)成及特點(diǎn)一、源程序的構(gòu)成及特點(diǎn)例:例: 1 data segment 2 sum db ? 3 data ends 4 code segment 5 assume cs:code,ds:data 6 begin: mov ax,data 7 mov ds,ax 8 mov
3、 sum,0 9 cycle: cmp sum,9 10 jna done 11 mov al,sum 12 out port,al 13 hlt 14 done:in al,port 15 add sum,al 16 jmp cyclk 17 code ends 18 end begin特點(diǎn):特點(diǎn):完整的匯編語言源程序由若干段組成,必須包含完整的匯編語言源程序由若干段組成,必須包含至少一個(gè)至少一個(gè)代碼段,代碼段,其他可有數(shù)據(jù)段、附加段或堆其他可有數(shù)據(jù)段、附加段或堆棧段,段與段之間的順序可隨意排列。棧段,段與段之間的順序可隨意排列。但一般數(shù)但一般數(shù)據(jù)段要放在代碼段之前。據(jù)段要放在代碼段之前。每
4、段以段定義語句每段以段定義語句segment開始,以開始,以ends結(jié)結(jié)束。束。每個(gè)代碼段至少有一條設(shè)定代碼段段基址的語句每個(gè)代碼段至少有一條設(shè)定代碼段段基址的語句assume ,其指明各段的段基址分別存于那個(gè)段,其指明各段的段基址分別存于那個(gè)段寄存器。寄存器。通常一條語句占一行。通常一條語句占一行。整個(gè)程序用整個(gè)程序用end結(jié)束,否則錯(cuò)誤。結(jié)束,否則錯(cuò)誤。 源程序由語句序列構(gòu)成匯編語言(匯編語言(assembly language)用用助記符表示的指令以及使用它們編寫程序的規(guī)則助記符表示的指令以及使用它們編寫程序的規(guī)則。匯編(匯編(assembly)將匯編語言書寫的將匯編語言書寫的程序翻譯成
5、機(jī)器語言程序的過程。程序翻譯成機(jī)器語言程序的過程。匯編程序(匯編程序(assembler)將匯編語言將匯編語言書寫的程序翻譯成機(jī)器語言程序的軟件。書寫的程序翻譯成機(jī)器語言程序的軟件。不要與匯編語言程序這個(gè)說法混淆,后者不要與匯編語言程序這個(gè)說法混淆,后者表示用匯編語言書寫的程序,或稱匯編語表示用匯編語言書寫的程序,或稱匯編語言源程序。言源程序。匯匯 編編匯編過程匯編過程 asm86,masm86(宏匯編)(宏匯編)匯編語言的指令和機(jī)器語言的指令之間有匯編語言的指令和機(jī)器語言的指令之間有一一對應(yīng)的關(guān)系。一一對應(yīng)的關(guān)系。匯編程序的任務(wù)匯編程序的任務(wù) 匯編程序的任務(wù)是把匯編語言源程序模塊轉(zhuǎn)換為匯編程
6、序的任務(wù)是把匯編語言源程序模塊轉(zhuǎn)換為二進(jìn)制的目標(biāo)模塊。二進(jìn)制的目標(biāo)模塊。匯編程序把源文件轉(zhuǎn)換為目標(biāo)文件的過程需要對匯編程序把源文件轉(zhuǎn)換為目標(biāo)文件的過程需要對源文件進(jìn)行兩遍掃視。源文件進(jìn)行兩遍掃視。 匯編程序的輸入是源文件(匯編程序的輸入是源文件(asm),而主要輸出),而主要輸出是是obj文件和文件和lst文件。文件。第一遍掃視要確定源程序每一行的偏移地址,掃第一遍掃視要確定源程序每一行的偏移地址,掃視后應(yīng)提供一張符號表(或稱標(biāo)識符表),它把源程視后應(yīng)提供一張符號表(或稱標(biāo)識符表),它把源程序所定義符號的偏移地址記錄下來。第二遍掃視則產(chǎn)序所定義符號的偏移地址記錄下來。第二遍掃視則產(chǎn)生所要求的生
7、所要求的obj、lst和和cref文件。文件。匯編程序在兩遍掃視的過程中用到的主要工具有匯編程序在兩遍掃視的過程中用到的主要工具有:1 地址計(jì)數(shù)器(地址計(jì)數(shù)器(location counter)匯編的第一遍掃視過程中,地址計(jì)數(shù)器的值匯編的第一遍掃視過程中,地址計(jì)數(shù)器的值可以用來確定每條指令的第一個(gè)字的偏移地址及可以用來確定每條指令的第一個(gè)字的偏移地址及數(shù)據(jù)段中變量名的值,這樣就可以建立一張符號數(shù)據(jù)段中變量名的值,這樣就可以建立一張符號表。表。2 符號表符號表匯編程序?qū)υ闯绦虻谝槐閽咭暤倪^程中建立了符匯編程序?qū)υ闯绦虻谝槐閽咭暤倪^程中建立了符號表,它把用戶所定義的符號賦予當(dāng)前地址計(jì)數(shù)器的號表,它
8、把用戶所定義的符號賦予當(dāng)前地址計(jì)數(shù)器的值。值。3 機(jī)器指令表機(jī)器指令表它是一張固定的表格,給出所有指令的助記符及它是一張固定的表格,給出所有指令的助記符及其對應(yīng)的機(jī)器指令代碼信息。其對應(yīng)的機(jī)器指令代碼信息。4 偽操作表偽操作表給出所有偽操作名及有關(guān)信息。給出所有偽操作名及有關(guān)信息。匯編程序在第一遍掃視后建立了符號表,在第二遍掃匯編程序在第一遍掃視后建立了符號表,在第二遍掃視的過程中,根據(jù)符號表、機(jī)器指令表和偽操作表把視的過程中,根據(jù)符號表、機(jī)器指令表和偽操作表把匯編語言指令翻譯成機(jī)器語言指令,完成匯編任務(wù)。匯編語言指令翻譯成機(jī)器語言指令,完成匯編任務(wù)。二、匯編語言的語句格式二、匯編語言的語句格
9、式指令指令(執(zhí)行執(zhí)行)性語句性語句指令性語句用于表達(dá)指令性語句用于表達(dá)處理器命令處理器命令(也稱硬指令也稱硬指令),匯編后產(chǎn)生指令,匯編后產(chǎn)生指令代碼。規(guī)定代碼。規(guī)定cpu進(jìn)行具體操作。進(jìn)行具體操作。標(biāo)號標(biāo)號: 指令助記符指令助記符 操作數(shù)操作數(shù),操作數(shù)操作數(shù) ;注釋注釋指示指示(說明說明)性語句性語句指示性語句即偽指令,指示性語句即偽指令,不產(chǎn)生操作碼不產(chǎn)生操作碼,僅在匯編時(shí)起作用僅在匯編時(shí)起作用,指示源程指示源程序如何匯編、變量怎樣定義、過程怎么設(shè)序如何匯編、變量怎樣定義、過程怎么設(shè)置等置等名字名字 偽指令助記符偽指令助記符 參數(shù)參數(shù),參數(shù)參數(shù), ;注釋注釋三、三、asm86的標(biāo)記的標(biāo)記1
10、、標(biāo)號、名字與標(biāo)識符、標(biāo)號、名字與標(biāo)識符標(biāo)號標(biāo)號是反映硬指令位置(邏輯地址)和屬性的標(biāo)是反映硬指令位置(邏輯地址)和屬性的標(biāo)識符,后跟一個(gè)冒號分隔識符,后跟一個(gè)冒號分隔名字名字是反映偽指令位置(邏輯地址)和屬性的標(biāo)是反映偽指令位置(邏輯地址)和屬性的標(biāo)識符,后跟空格沒有冒號識符,后跟空格沒有冒號標(biāo)識符標(biāo)識符(identifier)必須以字母開頭;可以由字)必須以字母開頭;可以由字母、數(shù)字、下劃線組成,默認(rèn)情況下,不區(qū)別字母、數(shù)字、下劃線組成,默認(rèn)情況下,不區(qū)別字母大小寫;一般最多由母大小寫;一般最多由31個(gè)字符,再長忽略不計(jì)。個(gè)字符,再長忽略不計(jì)。一個(gè)源程序中,每個(gè)標(biāo)識符的定義是唯一的,還一個(gè)
11、源程序中,每個(gè)標(biāo)識符的定義是唯一的,還不能是匯編語言采用的不能是匯編語言采用的保留字。保留字。(masm,由字母數(shù)字和特殊字符由字母數(shù)字和特殊字符?. _ $組成)組成)例例 標(biāo)號、名字和標(biāo)識符標(biāo)號、名字和標(biāo)識符data segmentsum db ?data endscode segment assume cs:code,ds:databegin: mov ax,data mov ds,ax 例、判斷下列標(biāo)識符是否符合要求例、判斷下列標(biāo)識符是否符合要求 m、pt3、m2n、wmu、86ase、 fgr#、f¥、¥、”hg”、aaa、loop、 bdh1、kl l、3xd、g65、h7s32、
12、保留字、保留字保留字(保留字(reserved word)是匯編語言中有特定意)是匯編語言中有特定意義的字符(也稱為關(guān)鍵字),主要有:義的字符(也稱為關(guān)鍵字),主要有:指令助記符指令助記符例如:例如:mov、add偽指令助記符偽指令助記符例如:例如:db、dw操作符操作符例如:例如:offset、ptr寄存器名寄存器名例如:例如:ax、cs其他的保留字其他的保留字關(guān)系運(yùn)算符等關(guān)系運(yùn)算符等 例如:例如:abs、byte、dup、common、le、low、seg、eq。 匯編語言大小寫不敏感3、界符(定義符)界符(定義符)除字母、數(shù)字以外的除字母、數(shù)字以外的8086允許使用的符號,允許使用的符號
13、,可以做分隔符及表示一定的意義。可以做分隔符及表示一定的意義。 如:如:+、-、*、/、=、,、;、:等等。、,、;、:等等。4、常數(shù)指令中出現(xiàn)的固定值、立即數(shù)、地址、常數(shù)指令中出現(xiàn)的固定值、立即數(shù)、地址等等 范圍范圍 065535可以有二進(jìn)制(可以有二進(jìn)制(b)、十進(jìn)制、八進(jìn)制()、十進(jìn)制、八進(jìn)制(q)、)、十六進(jìn)制(十六進(jìn)制(h)和字符串常數(shù)。)和字符串常數(shù)。 十進(jìn)制十進(jìn)制由由0 9數(shù)字組成,以字母數(shù)字組成,以字母d(d)結(jié))結(jié)尾(缺省情況可以省略)尾(缺省情況可以省略)100,255d十六進(jìn)制十六進(jìn)制由由0 9、a f數(shù)字組成,以字母數(shù)字組成,以字母h(h)結(jié)尾,以字母開頭的常數(shù)需要)結(jié)
14、尾,以字母開頭的常數(shù)需要加一個(gè)前導(dǎo)加一個(gè)前導(dǎo)064h,0ffh0b800h二進(jìn)制二進(jìn)制由由0和和1兩個(gè)數(shù)字組成,以字母兩個(gè)數(shù)字組成,以字母b(b)結(jié)尾結(jié)尾01100100b字符串常量是用單引號或雙引號括起來的字符串常量是用單引號或雙引號括起來的單個(gè)字符或多個(gè)字符單個(gè)字符或多個(gè)字符其其數(shù)值是每個(gè)字符對應(yīng)的數(shù)值是每個(gè)字符對應(yīng)的ascii碼值碼值例如:例如:d(等于(等于64h)ab(等于(等于4142h)hello, assembly !5、注釋、注釋語句中由分號語句中由分號“;”開始的部分為注釋內(nèi)容,開始的部分為注釋內(nèi)容,用以增加源程序的可讀性用以增加源程序的可讀性匯編程序在翻譯源程序時(shí)將跳過該
15、部分,不匯編程序在翻譯源程序時(shí)將跳過該部分,不對它們做任何處理,對它們做任何處理, 只在打印源程序時(shí)照原只在打印源程序時(shí)照原樣打印。樣打印。變變 量量變量變量代表存放在某些存儲(chǔ)單元的數(shù)據(jù),這些數(shù)據(jù)在程序運(yùn)代表存放在某些存儲(chǔ)單元的數(shù)據(jù),這些數(shù)據(jù)在程序運(yùn)行期間隨時(shí)可以修改。行期間隨時(shí)可以修改。為了便于對變量的訪問,它常常以變量名的形式出現(xiàn)為了便于對變量的訪問,它常常以變量名的形式出現(xiàn)在程序中,它可以認(rèn)為是存放數(shù)據(jù)存儲(chǔ)單元的符號地在程序中,它可以認(rèn)為是存放數(shù)據(jù)存儲(chǔ)單元的符號地址。址。 (1)變量的定義與預(yù)置:定義變量就是給變量分配存儲(chǔ)變量的定義與預(yù)置:定義變量就是給變量分配存儲(chǔ)單元且對這個(gè)存儲(chǔ)單元賦
16、于一個(gè)符號名單元且對這個(gè)存儲(chǔ)單元賦于一個(gè)符號名(變量名變量名),同,同時(shí)將這些存儲(chǔ)單元預(yù)置初值。時(shí)將這些存儲(chǔ)單元預(yù)置初值。 定義變量是用數(shù)據(jù)定義偽指令定義變量是用數(shù)據(jù)定義偽指令db,dw,dd等。例等。例如:如:變變 量量段屬性段屬性(seg):表示變量存放在哪一個(gè)邏輯段中:表示變量存放在哪一個(gè)邏輯段中(即變即變量所在段的段基值);量所在段的段基值);偏移量屬性偏移量屬性(offset):表示變量在邏輯段中離段起始:表示變量在邏輯段中離段起始點(diǎn)的字節(jié)數(shù);點(diǎn)的字節(jié)數(shù);類型屬性類型屬性(type):表示變量占用存儲(chǔ)單元的字節(jié)數(shù)。:表示變量占用存儲(chǔ)單元的字節(jié)數(shù)。變變 量量(2)數(shù)據(jù)定義偽指令:這種偽
17、指令主要為數(shù)數(shù)據(jù)定義偽指令:這種偽指令主要為數(shù)據(jù)項(xiàng)分配存儲(chǔ)單元并預(yù)置初值。據(jù)項(xiàng)分配存儲(chǔ)單元并預(yù)置初值。四、表達(dá)式四、表達(dá)式數(shù)值表達(dá)式一般是指由數(shù)值表達(dá)式一般是指由運(yùn)算符運(yùn)算符連接的各種常量所連接的各種常量所構(gòu)成的表達(dá)式構(gòu)成的表達(dá)式匯編程序在匯編過程中計(jì)算表達(dá)式,最終得到一匯編程序在匯編過程中計(jì)算表達(dá)式,最終得到一個(gè)確定的數(shù)值,所以也是常量個(gè)確定的數(shù)值,所以也是常量表達(dá)式的數(shù)值在程序運(yùn)行前的匯編階段計(jì)算,所表達(dá)式的數(shù)值在程序運(yùn)行前的匯編階段計(jì)算,所以組成表達(dá)式的各部分必須在匯編時(shí)就能確定以組成表達(dá)式的各部分必須在匯編時(shí)就能確定匯編語言支持多種運(yùn)算符匯編語言支持多種運(yùn)算符我們經(jīng)常使用的是加減乘除(
18、我們經(jīng)常使用的是加減乘除( * / )例如:例如:mov ax,3*4+5;等價(jià)于:;等價(jià)于:mov ax,171、操作數(shù)、操作數(shù) 可能是一個(gè)數(shù)據(jù)或是一個(gè)內(nèi)存單元的地址可能是一個(gè)數(shù)據(jù)或是一個(gè)內(nèi)存單元的地址 常用標(biāo)號表示常用標(biāo)號表示 如:如:port表示端口地址表示端口地址 存儲(chǔ)器單元地址也常用標(biāo)號表示存儲(chǔ)器單元地址也常用標(biāo)號表示 如:如: start:mov ax, data1 ;start表示本條指令所在的地址表示本條指令所在的地址 data1表示數(shù)據(jù)地址表示數(shù)據(jù)地址 其為物理地址包含段基址和偏移量其為物理地址包含段基址和偏移量2、運(yùn)算符、運(yùn)算符 用運(yùn)算符對一個(gè)或多個(gè)操作數(shù)進(jìn)行運(yùn)算,形成表用
19、運(yùn)算符對一個(gè)或多個(gè)操作數(shù)進(jìn)行運(yùn)算,形成表達(dá)式。達(dá)式。算術(shù)運(yùn)算符算術(shù)運(yùn)算符+、-、*、/、mod(取余)(取余) 如:如:5+2-3*2 (=1) 19mod7 (=5) 對地址運(yùn)算只能用對地址運(yùn)算只能用+、-,其余無意義,其余無意義 如:如:start+2、sum-5 等等 應(yīng)用舉例:應(yīng)用舉例:p139邏輯運(yùn)算符邏輯運(yùn)算符 and、or、not、xor 邏輯運(yùn)算按位進(jìn)行,操作數(shù)必須是數(shù)據(jù),結(jié)果也邏輯運(yùn)算按位進(jìn)行,操作數(shù)必須是數(shù)據(jù),結(jié)果也是數(shù)據(jù)是數(shù)據(jù) 如:如:77h and 84h (=04h) not 80h (=7fh) 注意:注意:上述邏輯運(yùn)算符與上述邏輯運(yùn)算符與8086指令形式相同,但指
20、令形式相同,但有本質(zhì)區(qū)別,指令在執(zhí)行時(shí)由有本質(zhì)區(qū)別,指令在執(zhí)行時(shí)由cpu完成,邏輯運(yùn)完成,邏輯運(yùn)算符在匯編時(shí)完成算符在匯編時(shí)完成如:如: and al,86h and port 設(shè)設(shè)port=foh 則匯編后本指令為:則匯編后本指令為: and al,80h關(guān)系運(yùn)算符關(guān)系運(yùn)算符 6種種 相等相等 eq 不等不等 ne 小于小于 lt 大于大于 gt 小于等于小于等于 le 大于等于大于等于 ge 關(guān)系運(yùn)算符的操作數(shù)是關(guān)系運(yùn)算符的操作數(shù)是2個(gè)數(shù)據(jù),或同一段個(gè)數(shù)據(jù),或同一段中中2個(gè)存儲(chǔ)單元的地址,匯編的結(jié)果:個(gè)存儲(chǔ)單元的地址,匯編的結(jié)果: 關(guān)系成立值為關(guān)系成立值為 ffffh 不成立值為不成立值為
21、0 例:例:mov bx, port lt 50h 當(dāng)當(dāng)port50時(shí),上條指令相當(dāng)于時(shí),上條指令相當(dāng)于 mov bx,0例:例:mov bx,(,( port lt 5)and20) or( port gt 5)and30) 如:如: port lt 5 成立成立 則為則為mov bx,20h port gt 5 成立成立 則為則為mov bx,30h分析運(yùn)算符和綜合(合成)運(yùn)算符分析運(yùn)算符和綜合(合成)運(yùn)算符 將存儲(chǔ)單元的地址分解為段基址、偏移量將存儲(chǔ)單元的地址分解為段基址、偏移量或者定義類型等?;蛘叨x類型等。 5個(gè)分析運(yùn)算符個(gè)分析運(yùn)算符lseg:取內(nèi)存單元的段基址:取內(nèi)存單元的段基址
22、如如 mov ax,seg data mov ds,axloffset 取內(nèi)存單元的偏移量取內(nèi)存單元的偏移量 如:如: mov bx,offset dat1l type 運(yùn)算符返回一個(gè)數(shù)值表示存儲(chǔ)單元運(yùn)算符返回一個(gè)數(shù)值表示存儲(chǔ)單元的類型的類型 規(guī)定:字節(jié)規(guī)定:字節(jié)1 字字2 雙字雙字4 如:如:mov al,type dat1 ;若;若dat1已定義為字節(jié)已定義為字節(jié) 則則al=1llength 長度長度 計(jì)算一個(gè)已定義的存儲(chǔ)區(qū)中存儲(chǔ)單元的數(shù)目計(jì)算一個(gè)已定義的存儲(chǔ)區(qū)中存儲(chǔ)單元的數(shù)目 注意:不是字節(jié)數(shù),而是按照定義時(shí)的類型注意:不是字節(jié)數(shù),而是按照定義時(shí)的類型為基本單位計(jì)算為基本單位計(jì)算 如:如
23、:kam dw 100 dup(?)(?) 則:則:length kam (=100) 應(yīng)用應(yīng)用 mov cx, length buffl size 尺寸尺寸 計(jì)算一個(gè)已定義的存儲(chǔ)區(qū)的字節(jié)數(shù)計(jì)算一個(gè)已定義的存儲(chǔ)區(qū)的字節(jié)數(shù) size=length*type 如上例中如上例中 size kam (=200) 另有另有2個(gè)綜合運(yùn)算符個(gè)綜合運(yùn)算符lptr 用它規(guī)定存儲(chǔ)單元的類型,要與用它規(guī)定存儲(chǔ)單元的類型,要與byte、word、dword聯(lián)合使用聯(lián)合使用例:例: mov byte ptr 2100h,0 not word ptr si另外:另外:ptr 也可以改變一個(gè)已經(jīng)規(guī)定了類型也可以改變一個(gè)已經(jīng)
24、規(guī)定了類型的存儲(chǔ)單元的類型,但不另分配存儲(chǔ)器。的存儲(chǔ)單元的類型,但不另分配存儲(chǔ)器。例:例:data段中段中 xyz dw 10 dup(?)(?) 然后用然后用 pp equ byte ptr xyz qq equ byte ptr xyz+1 kk equ dword ptr xyz+2則:則:xyz、xyz+1單元為字節(jié)單元為字節(jié) xyz+2xyz +5單元為雙字單元為雙字 其余單元為字單元。其余單元為字單元。lthis 與與ptr相似用來改變存儲(chǔ)區(qū)的類型。相似用來改變存儲(chǔ)區(qū)的類型。 不開辟新單元,與不開辟新單元,與equ聯(lián)用聯(lián)用 例:例:xyz-2 equ this byte xyz-1
25、 equ this byte xyz dw ? 則:則: xyz-1=xyz xyz-2=xyz+1 使用使用xyz-1、xyz-2時(shí)為字節(jié)單元時(shí)為字節(jié)單元 使用使用xyz時(shí)為字單元。時(shí)為字單元。 相當(dāng)于:相當(dāng)于: xyz dw? xyz-1 equ byte ptr xyz xyz-2 equ byte ptr xyz+1 this 常將常將equ this右邊的類型或距離賦右邊的類型或距離賦給左邊的變量或標(biāo)號。給左邊的變量或標(biāo)號。五、偽指令五、偽指令1、標(biāo)號賦值偽指令、標(biāo)號賦值偽指令 equ 給標(biāo)號定義數(shù)值或其他標(biāo)號給標(biāo)號定義數(shù)值或其他標(biāo)號 形式:形式: 標(biāo)號標(biāo)號 equ 表達(dá)式(數(shù)據(jù)或地
26、址)表達(dá)式(數(shù)據(jù)或地址) 標(biāo)號標(biāo)號 equ 舊標(biāo)號(已賦值)舊標(biāo)號(已賦值) 如:如:bold equ 212 new equ port+2 count equ cx cdb1 equ ade 用用equ定義過的標(biāo)號未解除前不能重新定義,不用定義過的標(biāo)號未解除前不能重新定義,不用的標(biāo)號可以解除。的標(biāo)號可以解除。 解除語句:解除語句:purge 形式:形式:purge 標(biāo)號標(biāo)號1,標(biāo)號,標(biāo)號2,.標(biāo)號標(biāo)號n2、定義存儲(chǔ)單元的偽指令、定義存儲(chǔ)單元的偽指令 規(guī)定存儲(chǔ)單元的內(nèi)容、長度及類型,最常用的是規(guī)定存儲(chǔ)單元的內(nèi)容、長度及類型,最常用的是db、dw 例:例: cr db 0dh buff dw 3
27、211h do2 db ? thig dw 10 dup(?) st db how are you ? table db 00,01,03,02,06,04,05,07 db 0fh,0eh,0ch,0dh,09,0bh,0ah,08 alph db 5 dup(1,2,4dup(3),2dup(1,0) 定義時(shí)可以用表達(dá)式定義時(shí)可以用表達(dá)式 如:如:in-port db port out-port db por+1l dd 定義雙字定義雙字 dq 定義定義4個(gè)字個(gè)字 dt 定義定義10個(gè)字個(gè)字3、定義單元類型的偽指令、定義單元類型的偽指令 byte、word、dword常用在指令中常用在指令
28、中 如:如:mov byte ptr di,0 inc word ptr bx+si jmp dword ptr 2000h4、段定義偽指令、段定義偽指令 segment、ends、assume、org 在運(yùn)行程序時(shí),每條語句、所用數(shù)據(jù)等都在某一在運(yùn)行程序時(shí),每條語句、所用數(shù)據(jù)等都在某一段中,因此因該給段起名字,規(guī)定段的起始地址,段中,因此因該給段起名字,規(guī)定段的起始地址,說明于其它段的關(guān)系等,要用段定義為指令。說明于其它段的關(guān)系等,要用段定義為指令。一般用法:段名一般用法:段名 segment ;段起始段起始 段名段名 ends ;段結(jié)束段結(jié)束 另外另外: segment后可寫后可寫定位類型
29、定位類型聯(lián)系類型聯(lián)系類型分類名分類名 定位類型可用低定位類型可用低4位為位為0、緊接起始、偶地址起始等、緊接起始、偶地址起始等 聯(lián)系類型可規(guī)定各段不連接、同名連接等聯(lián)系類型可規(guī)定各段不連接、同名連接等分類名用單引號引起,在連接時(shí)起作用。分類名用單引號引起,在連接時(shí)起作用。l 段設(shè)定語句段設(shè)定語句 每個(gè)代碼段中至少一條段設(shè)定語句,每個(gè)代碼段中至少一條段設(shè)定語句,用來設(shè)定段寄存器的內(nèi)容用來設(shè)定段寄存器的內(nèi)容 一般形式:一般形式: assume cs:code,ds:data, ss:stack,es:data 除除cs外,外,ds、ss、es還需用還需用mov指令完成傳送。指令完成傳送。 另外形式
30、:另外形式:assume nothing 表示刪除原設(shè)定過的段寄存器的內(nèi)容。表示刪除原設(shè)定過的段寄存器的內(nèi)容。lorg 規(guī)定目標(biāo)程序存放的偏移地址規(guī)定目標(biāo)程序存放的偏移地址 形式:形式:org 200h例:例: data segment m1 db2,3,4,5 ; m1偏移地址為偏移地址為0 data ends 比較:比較:data segment org 2000h m1 db2,3,4,5; m1偏移地址為偏移地址為2000h data ends 5、過程定義語句過程定義語句 proc、endp、near、far 定義過程:標(biāo)號定義過程:標(biāo)號 proc . . 標(biāo)號標(biāo)號 endpnear
31、 表示段內(nèi)調(diào)用形式如下表示段內(nèi)調(diào)用形式如下: 標(biāo)號標(biāo)號 proc near (可省略可省略)far 表示段間調(diào)用形式如下表示段間調(diào)用形式如下: 標(biāo)號標(biāo)號 proc far 6、源程序結(jié)束偽指令、源程序結(jié)束偽指令 end 告訴匯編源程序到此結(jié)束,必須有告訴匯編源程序到此結(jié)束,必須有end指指 令,否則匯編出現(xiàn)錯(cuò)誤。令,否則匯編出現(xiàn)錯(cuò)誤。 形式:形式:end 表達(dá)式(標(biāo)號)表達(dá)式(標(biāo)號) 表達(dá)式的作用是將第一條指令的地址自動(dòng)裝表達(dá)式的作用是將第一條指令的地址自動(dòng)裝入入cs和和ip。 例例 :多字節(jié)相加:多字節(jié)相加 data segment first db 11h,22h,33h,44h seco
32、nd db 55h,66h,77h,88h sum db 20 dup(?) data ends stack segment sta db 20 dup(?) top equ length sta stack endscode segment assume cs:code,ds:data,ss:stackstart: mov ax, data mov ds,ax mov ax, stack mov ss,ax mov ax, top mov sp,ax mov si, offset first mov di, offset sum mov bx, offset second mov cx, 0
33、4 cld clc aditi: call aaa1 loop aditi . . . aaa1 proc near lodsb adc al, bx daa stosb inc bx ret aaa1 endp code ends end start2 程序設(shè)計(jì)的基本方法及實(shí)例程序設(shè)計(jì)的基本方法及實(shí)例一、程序設(shè)計(jì)基本步驟一、程序設(shè)計(jì)基本步驟 分析問題,明確要求。分析問題,明確要求。建立數(shù)學(xué)模型。建立數(shù)學(xué)模型。確定算法。確定算法。畫程序流程圖。畫程序流程圖。編寫程序。編寫程序。上機(jī)調(diào)試。上機(jī)調(diào)試。1、算法、算法(algorithm) 算法是對特定問題求解步驟的一種描述,是指令算法是對特定問題求
34、解步驟的一種描述,是指令的有限序列。每一條指令表示一個(gè)或多個(gè)操作。的有限序列。每一條指令表示一個(gè)或多個(gè)操作。(1)有窮性。有窮性。一個(gè)算法必須在有窮步之后結(jié)束,即必須在有限一個(gè)算法必須在有窮步之后結(jié)束,即必須在有限時(shí)間內(nèi)完成。時(shí)間內(nèi)完成。(2)確定性。確定性。算法的每一步必須有確切的定義。算法的執(zhí)行對算法的每一步必須有確切的定義。算法的執(zhí)行對應(yīng)著的相同的輸人僅有惟一的一條路徑。應(yīng)著的相同的輸人僅有惟一的一條路徑。(3)可行性。可行性。算法中的每一步都可以通過已經(jīng)實(shí)現(xiàn)的基本運(yùn)算算法中的每一步都可以通過已經(jīng)實(shí)現(xiàn)的基本運(yùn)算的有限次執(zhí)行得以實(shí)現(xiàn)。的有限次執(zhí)行得以實(shí)現(xiàn)。(4)輸入。輸入。一個(gè)算法具有零個(gè)
35、或多個(gè)輸人,這些輸人取自特定一個(gè)算法具有零個(gè)或多個(gè)輸人,這些輸人取自特定的數(shù)據(jù)對象集合。的數(shù)據(jù)對象集合。(5)輸出。輸出。一個(gè)算法具有一個(gè)或多個(gè)輸出,這些輸出同輸人之一個(gè)算法具有一個(gè)或多個(gè)輸出,這些輸出同輸人之間存在某種特定的關(guān)系。間存在某種特定的關(guān)系。一個(gè)一個(gè)好的算法好的算法通常要考慮以下的通常要考慮以下的要求要求:(1)正確。正確。算法的執(zhí)行結(jié)果應(yīng)當(dāng)滿足預(yù)先規(guī)定算法的執(zhí)行結(jié)果應(yīng)當(dāng)滿足預(yù)先規(guī)定的功能和性能要求。的功能和性能要求。(2)可讀??勺x。一個(gè)算法應(yīng)當(dāng)思路清晰、層次分明、一個(gè)算法應(yīng)當(dāng)思路清晰、層次分明、簡單明了、易讀易懂。簡單明了、易讀易懂。(3)健壯。健壯。當(dāng)輸入不合法數(shù)據(jù)時(shí),能作正
36、當(dāng)處當(dāng)輸入不合法數(shù)據(jù)時(shí),能作正當(dāng)處理,不至引起嚴(yán)重后果。理,不至引起嚴(yán)重后果。(4)高效。高效。有效使用存儲(chǔ)空間和有較高的時(shí)間有效使用存儲(chǔ)空間和有較高的時(shí)間效率。效率。2、程序流程圖、程序流程圖程序流程圖是通過使用各種形狀的框,用程序流程圖是通過使用各種形狀的框,用來表示各種不同的操作,框內(nèi)文字由人們來表示各種不同的操作,框內(nèi)文字由人們根據(jù)操作的需要指定,應(yīng)當(dāng)是明確而無根據(jù)操作的需要指定,應(yīng)當(dāng)是明確而無“歧義性歧義性”的。帶箭頭的流程線,用來表的。帶箭頭的流程線,用來表示操作的順序,即指向下一步的操作,用示操作的順序,即指向下一步的操作,用流程圖表示算法形象直觀、流向清楚。流程圖表示算法形象直
37、觀、流向清楚。程序流程圖潛在的缺點(diǎn):允許流程線向任程序流程圖潛在的缺點(diǎn):允許流程線向任意方向轉(zhuǎn)移,這可能出現(xiàn)意方向轉(zhuǎn)移,這可能出現(xiàn)“亂麻式亂麻式”流程,流程,有時(shí)使人難以看懂其來龍去脈(可用有時(shí)使人難以看懂其來龍去脈(可用n-s結(jié)結(jié)構(gòu)化流程圖)。構(gòu)化流程圖)。3、基本程序結(jié)構(gòu)、基本程序結(jié)構(gòu)順序結(jié)構(gòu)順序結(jié)構(gòu) 也就是順序執(zhí)行結(jié)構(gòu),它是最基也就是順序執(zhí)行結(jié)構(gòu),它是最基本、最常用的結(jié)構(gòu)。所謂順序執(zhí)行,就是本、最常用的結(jié)構(gòu)。所謂順序執(zhí)行,就是按照程序語句行的自然順序,一條語句按按照程序語句行的自然順序,一條語句按一條語句地執(zhí)行程序。一條語句地執(zhí)行程序。選擇結(jié)構(gòu)選擇結(jié)構(gòu) 包括簡單選擇和多分支選擇結(jié)構(gòu),包括
38、簡單選擇和多分支選擇結(jié)構(gòu),這種結(jié)構(gòu)可以根據(jù)設(shè)定的條件,控制語句這種結(jié)構(gòu)可以根據(jù)設(shè)定的條件,控制語句流程,有選擇地執(zhí)行不同的語句序列。流程,有選擇地執(zhí)行不同的語句序列。重復(fù)結(jié)構(gòu)重復(fù)結(jié)構(gòu) 是用于在某些程序中,常常需要是用于在某些程序中,常常需要重復(fù)使用某一段相同的或類似的程序段,重復(fù)使用某一段相同的或類似的程序段,利用重復(fù)結(jié)構(gòu)可簡化大量的程序行。利用重復(fù)結(jié)構(gòu)可簡化大量的程序行。二、順序結(jié)構(gòu)程序設(shè)計(jì)及實(shí)例二、順序結(jié)構(gòu)程序設(shè)計(jì)及實(shí)例沒有分支、循環(huán)等轉(zhuǎn)移指令的程序,會(huì)按沒有分支、循環(huán)等轉(zhuǎn)移指令的程序,會(huì)按指令書寫的前后順利依次執(zhí)行,這就是順指令書寫的前后順利依次執(zhí)行,這就是順序程序序程序順序結(jié)構(gòu)是最基本
39、的程序結(jié)構(gòu)順序結(jié)構(gòu)是最基本的程序結(jié)構(gòu)完全采用順序結(jié)構(gòu)編寫的程序并不多見完全采用順序結(jié)構(gòu)編寫的程序并不多見例例1、將內(nèi)存單元、將內(nèi)存單元dat1中的組合中的組合bcd碼變換成兩個(gè)碼變換成兩個(gè)非組合非組合bcd碼,存于其后面的兩個(gè)單元。碼,存于其后面的兩個(gè)單元。 data segment dat1 db 76h,2dup(?)(?) data ends code segment assume cs:code,ds:data start:mov ax,data mov ds,ax mov si,offset dat1 mov al,si and al,0fh mov si+1,al mov al,s
40、i and al, 0f0h mov cl,4 ror al,cl mov si+2,al hltcode ends end start 問題一:如要將問題一:如要將2個(gè)非組合個(gè)非組合bcd碼變?yōu)榻M合碼變?yōu)榻M合bcd碼怎么辦?碼怎么辦?問題二:如要將問題二:如要將1個(gè)組合個(gè)組合bcd碼變?yōu)榇a變?yōu)?個(gè)個(gè)asc碼碼怎么辦?怎么辦?問題三:如要將問題三:如要將2個(gè)個(gè)asc碼變?yōu)榻M合碼變?yōu)榻M合bcd碼怎碼怎么辦?么辦?例例2、從鍵盤中鍵入、從鍵盤中鍵入09中的任意自然數(shù)中的任意自然數(shù)x,求其立,求其立方值。利用查表法,構(gòu)建方值。利用查表法,構(gòu)建09的立方表,字節(jié)變的立方表,字節(jié)變量量x存放鍵入的自然數(shù)
41、,其立方值存于下面的單存放鍵入的自然數(shù),其立方值存于下面的單元。元。 data segment tab dw 0h,1h,8h,27h,64h,125h, dw 216h, 343h,512h,729h x db ? xxx dw ? data ends code segment assume cs:code,ds:data start:mov ax,data mov ds,ax mov bx, offset tab mov si, offset x mov ah,1 int 21h and al,0fh mov si,al add al,al mov ah,0 add bx,ax mov a
42、x,bx mov si+1,ax mov ah,4ch int 21h code ends end start問題:可否直接查表指令?為什么?問題:可否直接查表指令?為什么? 三、分支程序設(shè)計(jì)及實(shí)例三、分支程序設(shè)計(jì)及實(shí)例分支程序根據(jù)條件是真或假?zèng)Q定執(zhí)行與否分支程序根據(jù)條件是真或假?zèng)Q定執(zhí)行與否判斷的條件是各種指令,如判斷的條件是各種指令,如cmp、test等等執(zhí)行后形成的狀態(tài)標(biāo)志執(zhí)行后形成的狀態(tài)標(biāo)志轉(zhuǎn)移指令轉(zhuǎn)移指令jcc和和jmp可以實(shí)現(xiàn)分支控制可以實(shí)現(xiàn)分支控制分支結(jié)構(gòu)有分支結(jié)構(gòu)有單分支結(jié)構(gòu)單分支結(jié)構(gòu)雙分支結(jié)構(gòu)雙分支結(jié)構(gòu)多分支結(jié)構(gòu)多分支結(jié)構(gòu)1、單分支結(jié)構(gòu)、單分支結(jié)構(gòu) 條件成立跳轉(zhuǎn),否條件成立跳轉(zhuǎn)
43、,否則順序執(zhí)行分支語則順序執(zhí)行分支語句體句體注意選擇正確的條注意選擇正確的條件轉(zhuǎn)移指令和轉(zhuǎn)移件轉(zhuǎn)移指令和轉(zhuǎn)移目標(biāo)地址目標(biāo)地址例例1、從端口地址為、從端口地址為port1的輸入端口輸入數(shù)值,的輸入端口輸入數(shù)值,與預(yù)定值相比,將差額的絕對值反饋給控制端口與預(yù)定值相比,將差額的絕對值反饋給控制端口port2 data segment a db 50h ;設(shè)預(yù)定值;設(shè)預(yù)定值 data ends code segment assume cs:code,ds:data go: mov ax,data mov ds,ax mov bl,a in al,port1 cmp al,bl jg lb1 xchg
44、al,bl lb1: sub al,bl out port2,alcode ends end go問題一:求差的絕對值還有其他方法嗎?問題一:求差的絕對值還有其他方法嗎?解答:解答:一、先減,為正即為絕對值,為負(fù),需求補(bǔ)。一、先減,為正即為絕對值,為負(fù),需求補(bǔ)。2、雙分支結(jié)構(gòu)、雙分支結(jié)構(gòu)條件成立跳轉(zhuǎn)執(zhí)行第條件成立跳轉(zhuǎn)執(zhí)行第2個(gè)個(gè)分支語句體,否則順序執(zhí)分支語句體,否則順序執(zhí)行第行第1個(gè)分支語句體個(gè)分支語句體注意注意:第:第1個(gè)分支體后一個(gè)分支體后一定要有一個(gè)定要有一個(gè)jmp指令跳到指令跳到第第2個(gè)分支體后個(gè)分支體后問題:分支程序中最需要問題:分支程序中最需要注意的指令是哪一條?注意的指令是哪一條
45、?jmp指令指令例、內(nèi)存單元中有一數(shù)例、內(nèi)存單元中有一數(shù)x(8位無符號),按下式計(jì)位無符號),按下式計(jì)算算y值,并將值,并將y值存于值存于x后面的單元后面的單元 data segment x db 42h y dw ? data endscode segment assume cs:code,ds:datastart: mov ax,data mov ds,ax mov al,x mov ah,0 cmp ax,50 jnb lop1 mov bx,ax mul bx mov dx,bx mov cl,2 shl bx,cl add bx,dx sub ax,bx add ax,20 jmp
46、lop2lop1: mov bx,ax shl ax,1 add ax,bx add ax,100 lop2: mov y,ax hlt code ends end start問題一:如問題一:如x是有符號數(shù)怎么辦?是有符號數(shù)怎么辦?問題二:如問題二:如x是是16位數(shù)怎么辦?位數(shù)怎么辦?問題三:如問題三:如x是是bcd碼怎么辦?碼怎么辦?3、多分支結(jié)構(gòu)、多分支結(jié)構(gòu)例、將某班同學(xué)的成績按優(yōu)、良、中、及格、不及例、將某班同學(xué)的成績按優(yōu)、良、中、及格、不及格分類統(tǒng)計(jì)人數(shù)。格分類統(tǒng)計(jì)人數(shù)。設(shè)設(shè) a:優(yōu)(:優(yōu)(5) b:良(:良(4) c:中(:中(3) d:及格(:及格(2) e:不及格(:不及格(1
47、) data segment a db 0 b db 0 c db 0 d db 0 e db 0 data ends code segment assume cs:code,ds:data begin: mov ax,data mov ds,ax mov ah,1 int 21h a1 : cmp al,5 jne b1 inc a jmp nextb1 : cmp al,4 jne c1 inc b jmp nextc1 : cmp al,3 jne d1 inc c jmp nextd1 : cmp al,2 jne e1 inc d jmp nexte1 : cmp al,1 jne
48、next inc enext: mov ah,4ch int 21h code ends end begin編寫分支程序要注意的問題編寫分支程序要注意的問題1、條件轉(zhuǎn)移語句的轉(zhuǎn)移范圍在、條件轉(zhuǎn)移語句的轉(zhuǎn)移范圍在-128+127字字節(jié)之間,若超出此范圍要和無條件轉(zhuǎn)移語節(jié)之間,若超出此范圍要和無條件轉(zhuǎn)移語句聯(lián)合使用句聯(lián)合使用 例例 la lop1 lop1: jmp lop2 lop2: 2、分支程序編寫時(shí)要注意每個(gè)分支的出口位、分支程序編寫時(shí)要注意每個(gè)分支的出口位置,如果程序復(fù)雜,要畫流程圖或置,如果程序復(fù)雜,要畫流程圖或n-s結(jié)構(gòu)結(jié)構(gòu)化流程圖化流程圖3、利用間接轉(zhuǎn)移的方式,可以實(shí)現(xiàn)動(dòng)態(tài)轉(zhuǎn)移、利
49、用間接轉(zhuǎn)移的方式,可以實(shí)現(xiàn)動(dòng)態(tài)轉(zhuǎn)移 如:如:sw dw lm0,lm1,lm2,.,lmn 在:在:code中可使用以下語句中可使用以下語句 mov si, n ;n為為n的的2倍倍 jmp sw+si 三、循環(huán)程序設(shè)計(jì)三、循環(huán)程序設(shè)計(jì)循環(huán)程序結(jié)構(gòu)循環(huán)程序結(jié)構(gòu)是滿足一定條件的情況下,是滿足一定條件的情況下,重復(fù)執(zhí)行某段程序重復(fù)執(zhí)行某段程序循環(huán)結(jié)構(gòu)的程序通常有循環(huán)結(jié)構(gòu)的程序通常有3個(gè)部分:個(gè)部分: 循環(huán)初始部分循環(huán)初始部分為開始循環(huán)準(zhǔn)備必要的條件,為開始循環(huán)準(zhǔn)備必要的條件,如循環(huán)次數(shù)、循環(huán)體需要的數(shù)值等如循環(huán)次數(shù)、循環(huán)體需要的數(shù)值等 循環(huán)體部分循環(huán)體部分指重復(fù)執(zhí)行的程序部分,其中指重復(fù)執(zhí)行的程序
50、部分,其中包括對循環(huán)條件等的修改程序段包括對循環(huán)條件等的修改程序段循環(huán)控制部分循環(huán)控制部分判斷循環(huán)條件是否成立,決判斷循環(huán)條件是否成立,決定是否繼續(xù)循環(huán)定是否繼續(xù)循環(huán)循環(huán)控制循環(huán)控制循環(huán)結(jié)構(gòu)程序循環(huán)結(jié)構(gòu)程序的設(shè)計(jì)關(guān)鍵是循環(huán)控制部分的設(shè)計(jì)關(guān)鍵是循環(huán)控制部分循環(huán)控制可以在進(jìn)入循環(huán)之前進(jìn)行,也可循環(huán)控制可以在進(jìn)入循環(huán)之前進(jìn)行,也可以在循環(huán)體后進(jìn)行,于是形成兩種結(jié)構(gòu):以在循環(huán)體后進(jìn)行,于是形成兩種結(jié)構(gòu):“先判斷、后循環(huán)先判斷、后循環(huán)”結(jié)構(gòu)結(jié)構(gòu)“先循環(huán)、后判斷先循環(huán)、后判斷”結(jié)構(gòu)結(jié)構(gòu)循環(huán)結(jié)束的控制可以用循環(huán)次數(shù),還可以循環(huán)結(jié)束的控制可以用循環(huán)次數(shù),還可以用特定條件等,于是又有:用特定條件等,于是又有:計(jì)
51、數(shù)控制循環(huán)計(jì)數(shù)控制循環(huán)條件控制循環(huán)條件控制循環(huán)先循環(huán)后判斷的循環(huán)結(jié)構(gòu)先循環(huán)后判斷的循環(huán)結(jié)構(gòu)1、 計(jì)數(shù)控制循環(huán)計(jì)數(shù)控制循環(huán) 計(jì)數(shù)控制循環(huán)計(jì)數(shù)控制循環(huán)利用利用循環(huán)次數(shù)循環(huán)次數(shù)作為控制條件作為控制條件易于采用循環(huán)指令易于采用循環(huán)指令loop和和jcxz實(shí)現(xiàn)實(shí)現(xiàn)初始化:將循環(huán)次數(shù)或最大循初始化:將循環(huán)次數(shù)或最大循環(huán)次數(shù)置入環(huán)次數(shù)置入cx循環(huán)體循環(huán)體循環(huán)控制:用循環(huán)控制:用loop指令對指令對cx減減1、并判斷是否為、并判斷是否為0例例1、數(shù)據(jù)塊是帶符號的、數(shù)據(jù)塊是帶符號的8位二進(jìn)制數(shù),要求位二進(jìn)制數(shù),要求把其中的正負(fù)數(shù)分開,分別存在其后的存把其中的正負(fù)數(shù)分開,分別存在其后的存儲(chǔ)區(qū)中。儲(chǔ)區(qū)中。 data
52、 segment da1 db 25h, bdh, 7fh,94h,65h,a5h da2 db 20dup(?) ; 正數(shù)正數(shù) da3 db 20dup(?) ; 負(fù)數(shù)負(fù)數(shù) data endscode segment assume cs:code, ds: datastart: mov ax , data mov ds, ax mov es, ax lea si, da1 lea di, da2 lea bx, da3 mov cx, 20go1: lods b test al,80 jnz neg1 stosb jmp nextneg1: xchg bx, di stosb xchg bx
53、,dinext: loop go1 hltcode ends end start問題:還需要要統(tǒng)計(jì)正、負(fù)數(shù)的個(gè)數(shù)該如何問題:還需要要統(tǒng)計(jì)正、負(fù)數(shù)的個(gè)數(shù)該如何處理?處理?例例2:內(nèi)存中連續(xù)存放:內(nèi)存中連續(xù)存放10個(gè)個(gè)8位無符號數(shù),計(jì)位無符號數(shù),計(jì)算其平均值,并將其存入其后的一個(gè)單元。算其平均值,并將其存入其后的一個(gè)單元。data segmentda1 db 35h,7bh,64h,89h,a2h 10個(gè)數(shù)個(gè)數(shù)da2 db ?data endscode segment assume cs:code, ds : databegin: mov ax,data mov ds,ax lea bx,da1;
54、 lea di,da2; mov cx,10; xor ax,ax;lp1: add al,bx ; jnc m1 ; inc ah ;m1: inc bx ; loop lp1 ; mov bl, 10 ; div bl ; mov di, alcode ends end begin 問題一:問題一: 注意高注意高8位的處理?位的處理? 問題二:如是問題二:如是bcd碼如何處理?碼如何處理? 個(gè)數(shù)等于個(gè)數(shù)等于10 xor ax, ax mov cl , 4 lp1: add al, bx shr ax , cl daa mov di , al adc ah,0 inc bx loop lp1
55、 個(gè)數(shù)大于個(gè)數(shù)大于10 ,求累加和求累加和 xor ax, ax lp1: add al, bx daa xchg al,ah adc al,0 daa xchg al,ah inc bx loop lp12 .條件控制循環(huán)條件控制循環(huán)條件控制循環(huán)需要利用特定條件判條件控制循環(huán)需要利用特定條件判斷循環(huán)是否結(jié)束斷循環(huán)是否結(jié)束條件控制循環(huán)用條件轉(zhuǎn)移指令判斷條件控制循環(huán)用條件轉(zhuǎn)移指令判斷循環(huán)條件循環(huán)條件轉(zhuǎn)移指令可以指定目的標(biāo)號來改變轉(zhuǎn)移指令可以指定目的標(biāo)號來改變程序的運(yùn)行順序,如果目的標(biāo)號指程序的運(yùn)行順序,如果目的標(biāo)號指向一個(gè)重復(fù)執(zhí)行的語句體的開始或向一個(gè)重復(fù)執(zhí)行的語句體的開始或結(jié)束,便構(gòu)成了循環(huán)控
56、制結(jié)構(gòu)結(jié)束,便構(gòu)成了循環(huán)控制結(jié)構(gòu)顯示以顯示以0結(jié)尾的字符串結(jié)尾的字符串;數(shù)據(jù)段;數(shù)據(jù)段string db let us have a try !,0;代碼段;代碼段mov bx,offset stringagain: mov dl,bxcmp dl,0jz done;為;為0結(jié)束結(jié)束mov ah,2;不為;不為0,顯示,顯示int 21hinc bx;指向下一個(gè)字符;指向下一個(gè)字符jmp againdone:記錄某個(gè)字存儲(chǔ)單元數(shù)據(jù)中記錄某個(gè)字存儲(chǔ)單元數(shù)據(jù)中1的個(gè)數(shù)的個(gè)數(shù);數(shù)據(jù)段數(shù)據(jù)段number dw 1110111111100100b;代碼段代碼段mov bx,numberxor dl,dl
57、;循環(huán)初值:;循環(huán)初值:dl0again:test bx,0ffffh ;也可以用;也可以用cmp bx,0jz done;全部是;全部是0就可以退出循環(huán),減少循環(huán)次數(shù)就可以退出循環(huán),減少循環(huán)次數(shù)shl bx,1;用指令;用指令shr bx,1也可以也可以adc dl,0;利用;利用adc指令加指令加cf的特點(diǎn)進(jìn)行計(jì)數(shù)的特點(diǎn)進(jìn)行計(jì)數(shù)jmp again3、多重循環(huán)(循環(huán)嵌套)、多重循環(huán)(循環(huán)嵌套)u 循環(huán)之中還有循環(huán),可以多次嵌套,典型例子雙循環(huán)之中還有循環(huán),可以多次嵌套,典型例子雙重循環(huán)。重循環(huán)。例:將一組數(shù)據(jù)按一定的順序(大小)排列。例:將一組數(shù)據(jù)按一定的順序(大小)排列?;痉椒ǎ夯痉椒?/p>
58、:1 1、兩兩相比(沉底法)、兩兩相比(沉底法) 大循環(huán)用交換標(biāo)志控制,有交換繼續(xù),否則停止大循環(huán)用交換標(biāo)志控制,有交換繼續(xù),否則停止。 小循環(huán)利用循環(huán)次數(shù)控制,循環(huán)次數(shù)依次遞減。小循環(huán)利用循環(huán)次數(shù)控制,循環(huán)次數(shù)依次遞減。 2 2、依次相比法(冒泡法)、依次相比法(冒泡法) 大、小循環(huán)用都利用循環(huán)次數(shù)控制,大循環(huán)大、小循環(huán)用都利用循環(huán)次數(shù)控制,大循環(huán)n-1n-1次,小循環(huán)從次,小循環(huán)從n-1n-1開始,并依次遞減開始,并依次遞減 將一組將一組16位有符號數(shù)按從大到小的順序排列位有符號數(shù)按從大到小的順序排列data segmentarray dw 1234h,5376h, 796ah,., 0a
59、b10hcount equ length arraydata endsstack segmentstapn dw 100 dup(?)top equ length stapnstack endscode segment assume cs: code, ds:data ,ss:stack start: mov ax, data mov ds, ax mov ax, stack mov ss, ax mov ax, top mov sp, ax mov bl, 0ffh; a1: cmp bl, 0ffh jne a4 ; xor bl,bl mov cx, count-1; xor si, s
60、i ; a2: mov ax, si+array; cmp ax,si+array+2; jge a3 xchg si+array+2, ax; mov si+array,ax mov bl,0ffh;a3: inc si; inc si; loop a2; jmp a1; a4: hltcode ends end start循環(huán)程序應(yīng)用舉例循環(huán)程序應(yīng)用舉例例例1: 將存儲(chǔ)器將存儲(chǔ)器al中的二進(jìn)制數(shù)變?yōu)槭M(jìn)制后,取轉(zhuǎn)中的二進(jìn)制數(shù)變?yōu)槭M(jìn)制后,取轉(zhuǎn)變后的百位數(shù)放在寄存器變后的百位數(shù)放在寄存器dl中中 kiok db 100 lea bx , kiok ; mov al,0f3h ; cvdec:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 河南省濮陽市2022-2023學(xué)年高二下學(xué)期化學(xué)學(xué)業(yè)質(zhì)量檢測試題(含答案)
- 倉山定向捐助活動(dòng)方案
- 仙桃騎行活動(dòng)策劃方案
- 代購加人活動(dòng)方案
- 仲秋營銷活動(dòng)方案
- 企業(yè)五四宣傳活動(dòng)方案
- 企業(yè)世界閱讀日活動(dòng)方案
- 企業(yè)促生產(chǎn)活動(dòng)方案
- 企業(yè)公司宣傳舞蹈活動(dòng)方案
- 企業(yè)創(chuàng)意元旦活動(dòng)方案
- 醫(yī)院藥事管理相關(guān)知識課件
- 2022年二手車交易服務(wù)企業(yè)組織架構(gòu)及部門職責(zé)
- 畢業(yè)論文指導(dǎo)記錄12篇
- 招標(biāo)代理公司招標(biāo)代理服務(wù)方案(技術(shù)標(biāo))
- 新能源汽車與傳統(tǒng)汽車的對比
- 中班健康課件《夏天少喝飲料》
- 卒中防治中心建設(shè)情況匯報(bào)
- 紫羅蘭永恒花園
- 酸感受離子通道的結(jié)構(gòu)與功能
- (完整版)A4拼音四線格打印模板
- 救護(hù)車音響電路設(shè)計(jì)及引力波的實(shí)驗(yàn)探測給我們的啟示
評論
0/150
提交評論