【正文】
convert h。 move to AL and al , 0fh 。 set count to 4 bits rol bx , cl 。 CONSOLE SCREEN binihex proc near mov ch , 4 。 。 return from decibin decibin endp 。 add digit to number jmp newchar 。 number 。 number times 10 xchg ax , bx 。 number mov cx , 10d 。 Multiply number in BX by 10 decimal xchg ax , bx 。 byte in AL to word in AX 。 is it9d? jg exit 。 ASCII to binary jl exit 。 keyboard input int 21h 。 clear BX for number 。 PROCEDURE TO CONVERT DEC ON KEYBD TO BINARY, 。 do it again Main endp 。 binary to screenw call crif 。 keyboard to binary call crif 。 MAIN PART OF PROGRAM. 。 to hex on screen 。 DECIHEXmain Program 。 采用子程序結(jié)構(gòu),程序安排為: 子程序名 DECIBIN: 功能:從鍵盤取得十進(jìn)制數(shù)并將其轉(zhuǎn)換為二進(jìn)制數(shù); 子程序名 BINHEX: 功能:把二進(jìn)制數(shù)以十六進(jìn)制數(shù)形式在屏上顯示; 子程序名 CRLF: 功能:回車和換行 。 1. 示例 【 例 】 十進(jìn)制數(shù)到十六進(jìn)制數(shù)轉(zhuǎn)換程序。可建立一個(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ì)算。 試編寫一程序,根據(jù)用戶鍵 入的月份數(shù)在屏上顯示該月份的英文縮寫名。 (2) 程序需進(jìn)入 TD(或 debug)運(yùn)行并查看計(jì)數(shù)結(jié)果。 提示 : (1) 程序可采用 0AH 功能調(diào)用把鍵入的字符直接送入到緩沖區(qū)中,然后再逐個(gè)取出分類計(jì)數(shù)。 【實(shí)驗(yàn) 】 分類統(tǒng)計(jì)字符個(gè)數(shù) COUNT_CHAR。************************************************************************************************ end start 。 procedure_select ends 。 we reach here only if no bit was set ┇ 。 adding 2 jmp 1 。 if no transfer, then the bit that, 。 if CF = 0, the on bit in al has not yet ben found jmp word ptr [bx] 。 bx set to location holding address of first routine 1: shr al , 1 。 this test assures that some bit of al has been set je continue_main_line 。 data segnmt addr mov ds , bx 。 put zero in bx 27 push bx 。 starting execution address set up stack for return push ds 。 main proc far 。************************************************************************************************* procedure_select segment 。 branch_addr segment 。根據(jù) AL 寄存器中哪一位為 1(從低位到高位 )把程序轉(zhuǎn)移到 8 個(gè)不同的程序分支去。 prgnam ends end start 。 return to DOS main endp 。 90 ? jl eight cmp ax , 100 。 70 ? jl six cmp ax , 80 。 get a result cmp ax , 60 。 initialize loop count value mov bx , offset grade 。 GOES HERE mov s5 , 0 。 into DS register 。 PROGRAM TITLE GOES 。程序框圖見圖 ,用 debug (或TD)可檢 查程序運(yùn)行結(jié)果。 設(shè)有 10個(gè)學(xué)生的成績分別為 5 6 8 8 7 8 9 6 100和 80分。 分支程序的設(shè)計(jì) 【 實(shí)驗(yàn)?zāi)康?】 學(xué)習(xí)分支程序的結(jié)構(gòu),掌握具有分支結(jié)構(gòu)程序的設(shè)計(jì)方法。 實(shí)驗(yàn)要求: ① 將最大項(xiàng)數(shù)與和數(shù)分別存入 N 和 SUM 單元,用 TD 調(diào)試,運(yùn)行程序并檢查結(jié)果; ② 將結(jié)果在 屏幕上以 16 進(jìn)制數(shù)顯示。再用編輯文件顯示 LST 文件的內(nèi)容,就可以看到 NUM 單元的 8 個(gè)數(shù)經(jīng)匯編后生成的機(jī)器數(shù)了。 ② 最 大的真值數(shù)應(yīng)是 3DH。 【 實(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單元。具體用法是:在顯示空白或回車、換行符前用指令 push dx 把 DI的內(nèi)容保存到堆 棧 中去。每行結(jié)束時(shí),用顯示回車 (ASCII為 0dh)和換行符 (ASCII 為 0ah)來結(jié)束本行并開始下一行。 提示 : (1) 顯示每個(gè)字符可使用功能號(hào)為 02 的顯示輸出功能調(diào)用,使用方法如下: mov ah , 02h mov dl , 輸出字 符的 ASCII碼 int 21h 本題中可把 DI初始化為 10H,然后不斷使其加 1(用 INC指令 ) 以取得下一個(gè)字符時(shí) ASCII碼。 實(shí)驗(yàn)要求:按 15 行 16 列的表格形式顯示 ASCII碼為 10H 100H的所有字符,即以行為主的順序及 ASCII 碼遞增的次序依次顯示對(duì)應(yīng)的字符。 end assemly 使用 debug 或 TD 來查看程序的運(yùn)行結(jié)果 , 可以看出主程序結(jié)束時(shí) , rank 數(shù)組已存放了學(xué)生的名次。 prognam ends 。 return to DOS main endp 。 into DS register 。s segment mov ax , datarea 。 save it on stack 。 Save old data segment sub ax , ax 。 Starting execution address, Set up stack 。 main proc far 。 prognam segment 。 [程序清單 ]: datarea segment ?,F(xiàn)將 寄存器的分配情況說明如下 : AX 存放當(dāng)前被測(cè)學(xué)生的成績; BX 存放當(dāng)前被測(cè)學(xué)生的相對(duì)地址指針; 22 CX 內(nèi)循環(huán)計(jì)數(shù)值; DX 當(dāng)前被測(cè)學(xué)生的名次計(jì)數(shù)值; SI 內(nèi)循環(huán)測(cè)試時(shí)的地址指針; DI 外循環(huán)計(jì)數(shù)值。由于數(shù)組的長度是確定的,因此內(nèi)、外層均可用計(jì)數(shù)值來控制循環(huán)的結(jié)束。 本題可以用兩重循環(huán)結(jié)構(gòu)來實(shí)現(xiàn)。 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é)生的成績。 codesg ends 。 addr of descr‘n rep movsw lea dx , descrn mov ah , 09h int 21h jmp start exit: ret 。 not in table mov ah , 09h int 21h jmp exit a30: mov cx , 07 。 equel exit add si , 14 。 No. of entries Lea si , stoktab a20: cmp ax , word ptr [si] 。 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 。register mov es , ax 。 on stack mov ax , datasg mov ds , ax 。 in AX push ax 。data segment sub ax , ax 。 codesg segment para ?code‘ assume cs: codesg , ds: datasg , es: datasg main proc far push ds 。 Table search 。.PROGRAM TITLE GOES 。如表格中并無用戶給出的編號(hào),則顯示 Not in table!后結(jié)束程序。如用戶給出的編號(hào)可在表格中查到,則顯示出相應(yīng)的庫存品名。循環(huán)的結(jié)束條件應(yīng)該是在找到用戶所指定的項(xiàng)時(shí)就可退出循環(huán),但還必須考慮在表格中未查到所需編號(hào)的特殊情 況。 其中,第二部分是程序的主體,顯然它可以使用循環(huán)結(jié)構(gòu)。 , ?Excavatos‘ DB ?08‘ , ?Lifters‘ ┇ 試編寫一程序,根據(jù)用戶提供的編號(hào)在終端上顯示其名稱。 1. 示