【正文】
codesg ends 。 本題可以用兩重循環(huán)結(jié)構(gòu)來實(shí)現(xiàn)。現(xiàn)將 寄存器的分配情況說明如下 : AX 存放當(dāng)前被測學(xué)生的成績; BX 存放當(dāng)前被測學(xué)生的相對(duì)地址指針; 22 CX 內(nèi)循環(huán)計(jì)數(shù)值; DX 當(dāng)前被測學(xué)生的名次計(jì)數(shù)值; SI 內(nèi)循環(huán)測試時(shí)的地址指針; DI 外循環(huán)計(jì)數(shù)值。 prognam segment 。 Starting execution address, Set up stack 。 save it on stack 。 into DS register 。 prognam ends 。 實(shí)驗(yàn)要求:按 15 行 16 列的表格形式顯示 ASCII碼為 10H 100H的所有字符,即以行為主的順序及 ASCII 碼遞增的次序依次顯示對(duì)應(yīng)的字符。每行結(jié)束時(shí),用顯示回車 (ASCII為 0dh)和換行符 (ASCII 為 0ah)來結(jié)束本行并開始下一行。 【 實(shí)驗(yàn) 】統(tǒng)計(jì)負(fù)數(shù)的個(gè)數(shù) 設(shè)數(shù)據(jù)段有 8個(gè)有符號(hào)數(shù): NUM DB 19, +28, 37, 46, +55, 61, 74, +255 設(shè)計(jì)一個(gè)程序 (不是兩個(gè)程序 )完成兩項(xiàng)要求: (1) 統(tǒng)計(jì)并且顯示負(fù)數(shù)的個(gè)數(shù) ,存入 N單元; 找出真值最大的數(shù), 存入 MAX單元。再用編輯文件顯示 LST 文件的內(nèi)容,就可以看到 NUM 單元的 8 個(gè)數(shù)經(jīng)匯編后生成的機(jī)器數(shù)了。 分支程序的設(shè)計(jì) 【 實(shí)驗(yàn)?zāi)康?】 學(xué)習(xí)分支程序的結(jié)構(gòu),掌握具有分支結(jié)構(gòu)程序的設(shè)計(jì)方法。程序框圖見圖 ,用 debug (或TD)可檢 查程序運(yùn)行結(jié)果。 into DS register 。 initialize loop count value mov bx , offset grade 。 70 ? jl six cmp ax , 80 。 return to DOS main endp 。根據(jù) AL 寄存器中哪一位為 1(從低位到高位 )把程序轉(zhuǎn)移到 8 個(gè)不同的程序分支去。************************************************************************************************* procedure_select segment 。 starting execution address set up stack for return push ds 。 data segnmt addr mov ds , bx 。 bx set to location holding address of first routine 1: shr al , 1 。 if no transfer, then the bit that, 。 we reach here only if no bit was set ┇ 。************************************************************************************************ end start 。 提示 : (1) 程序可采用 0AH 功能調(diào)用把鍵入的字符直接送入到緩沖區(qū)中,然后再逐個(gè)取出分類計(jì)數(shù)。 試編寫一程序,根據(jù)用戶鍵 入的月份數(shù)在屏上顯示該月份的英文縮寫名。 1. 示例 【 例 】 十進(jìn)制數(shù)到十六進(jìn)制數(shù)轉(zhuǎn)換程序。 DECIHEXmain Program 。 MAIN PART OF PROGRAM. 。 binary to screenw call crif 。 PROCEDURE TO CONVERT DEC ON KEYBD TO BINARY, 。 keyboard input int 21h 。 is it9d? jg exit 。 Multiply number in BX by 10 decimal xchg ax , bx 。 number times 10 xchg ax , bx 。 add digit to number jmp newchar 。 。 set count to 4 bits rol bx , cl 。 convert h。 move to AL and al , 0fh 。 CONSOLE SCREEN binihex proc near mov ch , 4 。 return from decibin decibin endp 。 number 。 number mov cx , 10d 。 byte in AL to word in AX 。 ASCII to binary jl exit 。 clear BX for number 。 do it again Main endp 。 keyboard to binary call crif 。 to hex on screen 。 采用子程序結(jié)構(gòu),程序安排為: 子程序名 DECIBIN: 功能:從鍵盤取得十進(jìn)制數(shù)并將其轉(zhuǎn)換為二進(jìn)制數(shù); 子程序名 BINHEX: 功能:把二進(jìn)制數(shù)以十六進(jìn)制數(shù)形式在屏上顯示; 子程序名 CRLF: 功能:回車和換行 ??山⒁粋€(gè)月份縮寫表: MONTAB DB ?JAN‘ , ?FEB‘ , ?MAR‘ , ?APR‘ , ?MAY‘ , ?JUN‘ DB ?JUL‘ , ?AUG‘ , ?SEP‘ , ?OCT‘ , ?NOV‘ , DEC‘ (2) 用戶給定的月份數(shù)與其對(duì)應(yīng)的英文縮寫表格地址為: MONTAB + (月份數(shù) 1) * 3 注意 :用戶鍵入的月份數(shù)是 ASCII 碼,必須先轉(zhuǎn)換為數(shù)字才能用以上公式計(jì)算。 (2) 程序需進(jìn)入 TD(或 debug)運(yùn)行并查看計(jì)數(shù)結(jié)果。 【實(shí)驗(yàn) 】 分類統(tǒng)計(jì)字符個(gè)數(shù) COUNT_CHAR。 procedure_select ends 。 adding 2 jmp 1 。 if CF = 0, the on bit in al has not yet ben found jmp word ptr [bx] 。 this test assures that some bit of al has been set je continue_main_line 。 put zero in bx 27 push bx 。 main proc far 。 branch_addr segment 。 prgnam ends end start 。 90 ? jl eight cmp ax , 100 。 get a result cmp ax , 60 。 GOES HERE mov s5 , 0 。 PROGRAM TITLE GOES 。 設(shè)有 10個(gè)學(xué)生的成績分別為 5 6 8 8 7 8 9 6 100和 80分。 實(shí)驗(yàn)要求: ① 將最大項(xiàng)數(shù)與和數(shù)分別存入 N 和 SUM 單元,用 TD 調(diào)試,運(yùn)行程序并檢查結(jié)果; ② 將結(jié)果在 屏幕上以 16 進(jìn)制數(shù)顯示。 ② 最 大的真值數(shù)應(yīng)是 3DH。具體用法是:在顯示空白或回車、換行符前用指令 push dx 把 DI的內(nèi)容保存到堆 棧 中去。 提示 : (1) 顯示每個(gè)字符可使用功能號(hào)為 02 的顯示輸出功能調(diào)用,使用方法如下: mov ah , 02h mov dl , 輸出字 符的 ASCII碼 int 21h 本題中可把 DI初始化為 10H,然后不斷使其加 1(用 INC指令 ) 以取得下一個(gè)字符時(shí) ASCII碼。 end assemly 使用 debug 或 TD 來查看程序的運(yùn)行結(jié)果 , 可以看出主程序結(jié)束時(shí) , rank 數(shù)組已存放了學(xué)生的名次。 return to DOS main endp 。s segment mov ax , datarea 。 Save old data segment sub ax , ax 。 main proc far 。 [程序清單 ]: datarea segment 。由于數(shù)組的長度是確定的,因此內(nèi)、外層均可用計(jì)數(shù)值來控制循環(huán)的結(jié)束。 end of code assembly [運(yùn)行情況 ]: C:\tsrch stock nember? 23 Processors stock nember? 27 Pumps stock nember? 05 Excavators stock nember? C:\tsrch stock nember? 09 Presses stock nember? 08 Lifters stock nember? 12 Valves stock nember? Not in table! 【 例 】 建立學(xué)生名次表 rank 以 grade 為首地址的 10 個(gè)字的數(shù)組中保存了學(xué)生的成績,其中 grade+i 保存學(xué)號(hào)為 i+1 的學(xué)生的成績。 addr of descr‘n rep movsw lea dx , descrn mov ah , 09h int 21h jmp start exit: ret 。 equel exit add si , 14 。 Prompt for stock number mov ah , 09 int 21h lea dx , stoknin mov ah , 0ah int 21h cmp act , 0 Je exit Mov al , stokn 。register mov es , ax 。 in AX push ax 。 codesg segment para ?code‘ assume cs: codesg , ds: datasg , es: datasg main proc far push ds 。.PROGRAM TITLE GOES 。如用戶給出的編號(hào)可在表格中查到,則顯示出相應(yīng)的庫存品名。 其中,第二部分是程序的主體,顯然它可以使用循環(huán)結(jié)構(gòu)。 1. 示 例 【 例 】 表格查找 tabsrch 19 倉庫管理中,總共存有有關(guān)庫存品的編號(hào)、名稱、數(shù)量、價(jià)格等情況的表格,根據(jù)用戶提供的編號(hào)可以找到有關(guān)材料。( a,b 為字變量) 【 實(shí)驗(yàn) 】 設(shè)有兩個(gè)帶符號(hào)整數(shù)變量 A 和 B,求 A 和 B 之差并判斷結(jié)果是否溢出。 display string function INT 21H 。 store carry OR Z , 30H 。 exchange high_order in AL ADC AL , X 。 adjust for sub XCHG AL , Z+2 。 put result in Z‘s low order MOV AL , Y 。 clear AH MOV AL , Y+1 。2439。 X DB 39。程序流程見圖 。 否則 ,余數(shù)減 10 17 INC [BX+8] 。