匯編語言課后習(xí)題答案 王爽主編
《匯編語言課后習(xí)題答案 王爽主編》由會員分享,可在線閱讀,更多相關(guān)《匯編語言課后習(xí)題答案 王爽主編(50頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
檢測點(diǎn) 9 2 補(bǔ)全編程 利用 jcxz 指令 實(shí)現(xiàn)在內(nèi)存 2000H 段中查找第一個值為 0 的字節(jié) 找到后 將它的偏移地址 存儲在 dx 中 assume cs code code segment start mov ax 2000h mov ds ax mov bx 0 s mov ch 0 mov cl bx jcxz ok 當(dāng) cx 0 時 CS IP 指向 OK inc bx jmp short s ok mov dx bx mov ax 4c00h int 21h code ends end start 檢測點(diǎn) 9 3 補(bǔ)全編程 利用 loop 指令 實(shí)現(xiàn)在內(nèi)存 2000H 段中查找第一個值為 0 的字節(jié) 找到后 將它的偏移地址 存儲在 dx 中 assume cs code code segment start mov ax 2000h mov ds ax mov bx 0 s mov cl bx mov ch 0 inc cx inc bx loop s ok dec bx mov dx bx mov ax 4c00h int 21h code ends end start 書 P101 執(zhí)行 loop s 時 首先要將 cx 減 1 loop 標(biāo)號 相當(dāng)于 dec cx if cx 0 jmp short 標(biāo)號 檢測點(diǎn) 10 1 補(bǔ)全程序 實(shí)現(xiàn)從內(nèi)存 1000 0000 處開始執(zhí)行指令 assume cs code stack segment db 16 dup 0 stack ends code segment start mov ax stack mov ss ax mov sp 16 mov ax 1000h push ax mov ax 0 push ax retf code ends end start 執(zhí)行 reft 指令時 相當(dāng)于進(jìn)行 pop ip pop cs 根據(jù)棧先進(jìn)后出原則 應(yīng)先將段地址 cs 入棧 再將偏移地址 ip 入棧 檢測點(diǎn) 10 3 下面的程序執(zhí)行后 ax 中的數(shù)值為多少 內(nèi)存地址 機(jī)器碼 匯編指令 執(zhí)行后情況 1000 0 b8 00 00 mov ax 0 ax 0 ip 指向 1000 3 1000 3 9a 09 00 00 10 call far ptr s pop cs pop ip ip 指向 1000 9 1000 8 40 inc ax 1000 9 58 s pop ax ax 8h add ax ax ax 10h pop bx bx 1000h add ax bx ax 1010h 用 debug 進(jìn)行跟蹤確認(rèn) call far ptr s 是先將該指令后的第一個字節(jié)段地址 cs 1000h 入棧 再將偏 移地址 ip 8h 入棧 最后轉(zhuǎn)到標(biāo)號處執(zhí)行指令 出棧時 根據(jù)棧先進(jìn)后出的原則 先出的為 ip 8h 后出的為 cs 1000h 檢測點(diǎn) 10 4 下面的程序執(zhí)行后 ax 中的數(shù)值為多少 內(nèi)存地址 機(jī)器碼 匯編指令 執(zhí)行后情況 1000 0 b8 06 00 mov ax 6 ax 6 ip 指向 1000 3 1000 3 ff d0 call ax pop ip ip 指向 1000 6 1000 5 40 inc ax 1000 6 58 mov bp sp bp sp fffeh add ax bp ax 6 ds fffeh 6 5 0bh 用 debug 進(jìn)行跟蹤確認(rèn) call ax 16 位 reg 是先將該指令后的第一個字節(jié)偏移地址 ip 入棧 再轉(zhuǎn)到 偏移地址為 ax 16 位 reg 處執(zhí)行指令 檢測點(diǎn) 10 5 1 下面的程序執(zhí)行后 ax 中的數(shù)值為多少 assume cs code stack segment dw 8 dup 0 stack ends code segment start mov ax stack mov ss ax mov sp 16 mov ds ax mov ax 0 call word ptr ds 0eh inc ax inc ax inc ax mov ax 4c00h int 21h code ends end start 推算 執(zhí)行 call word ptr ds 0eh 指令時 先 cs 入棧 再 ip 11 入棧 最后 ip 轉(zhuǎn)移到 ds 0eh ds 0eh 11h 執(zhí)行 inc ax 最終 ax 3 題中特別關(guān)照別用 debug 跟蹤 跟蹤結(jié)果不一定正確 但還是忍不住去試試 看是什么結(jié)果 根據(jù)單步跟蹤發(fā)現(xiàn) 執(zhí)行 call word ptr ds 0eh 指令時 顯示 ds 0eh 065D ds 0000 ds 0010 不是已設(shè)置成 stack 數(shù)據(jù)段了嘛 不是應(yīng)該全都是 0 的嘛 于是進(jìn)行了更詳細(xì)的單步跟蹤 發(fā)現(xiàn)初始數(shù)據(jù)段中數(shù)據(jù)確實(shí)為 0 但執(zhí)行完 mov ss ax mov sp 16 這兩 條指令后 數(shù)據(jù)段中數(shù)據(jù)發(fā)生改變 這是為什么呢 中斷唄 檢測點(diǎn) 10 5 2 下面的程序執(zhí)行后 ax 和 bx 中的數(shù)值為多少 assume cs codesg stack segment dw 8 dup 0 stack ends codesg segment start mov ax stack mov ss ax mov sp 10h mov word ptr ss 0 offset s ss 0 1ah mov ss 2 cs ss 2 cs call dword ptr ss 0 cs 入棧 ip 19h 入棧 轉(zhuǎn)到 cs 1ah 處執(zhí)行指令 ss 4 cs ss 6 ip nop s mov ax offset s ax 1ah sub ax ss 0ch ax 1ah ss 0ch 1ah 19h 1 mov bx cs bx cs 0c5bh sub bx ss 0eh bx cs cs 0 mov ax 4c00h int 21h codesg ends end start C DOCUME 1 ADMINI 1 debug jc10 5 exe u 0C5B 0000 B85A0C MOV AX 0C5A 0C5B 0003 8ED0 MOV SS AX 0C5B 0005 BC1000 MOV SP 0010 0C5B 0008 36 SS 0C5B 0009 C70600001A00 MOV WORD PTR 0000 001A 0C5B 000F 36 SS 0C5B 0010 8C0E0200 MOV 0002 CS 0C5B 0014 36 SS 0C5B 0015 FF1E0000 CALL FAR 0000 0C5B 0019 90 NOP 0C5B 001A B81A00 MOV AX 001A 0C5B 001D 36 SS 0C5B 001E 2B060C00 SUB AX 000C u 0C5B 0022 8CCB MOV BX CS 0C5B 0024 36 SS 0C5B 0025 2B1E0E00 SUB BX 000E 0C5B 0029 B8004C MOV AX 4C00 課程設(shè)計(jì)一 將實(shí)驗(yàn) 7 中的 Power idea 公司的數(shù)據(jù)按照圖所示的格式在屏幕上顯示現(xiàn)來 table segment db 1975 1976 1977 1978 1979 1980 1981 1982 1983 db 1984 1985 1986 1987 1988 1989 1990 1991 1992 db 1993 1994 1995 dd 16 22 382 1356 2390 8000 16000 24486 50065 97479 140417 197514 dd 345980 590827 803530 1183000 1843000 2795000 3753000 4649000 5937000 dw 3 7 9 13 28 38 130 220 476 778 1001 1442 2258 2793 4037 5635 8226 dw 11542 14430 15257 17800 dw 5 3 42 104 85 210 123 111 105 125 140 136 153 211 199 209 224 239 dw 260 304 333 table ends data segment db 32 dup 0 data ends code segment start mov ax data mov ds ax mov ax table mov es ax mov bx 0 mov si 0 mov di 0 mov cx 21 mov dh 2 mov dl 30 g push cx push dx mov ax es bx mov si ax mov ax es bx 2 mov si 2 ax 年份入 ds si add si 6 mov ax es bx 84 mov dx es bx 86 call dtoc2 收入轉(zhuǎn)成十進(jìn)制字符入 ds si add si 10 mov ax es di 168 mov dx 0 call dtoc2 人員數(shù)轉(zhuǎn)成十進(jìn)制字符入 ds si add si 6 mov ax es di 210 mov dx 0 call dtoc2 人均收入轉(zhuǎn)成十進(jìn)制字符入 ds si mov si 0 設(shè)置 ds si 指向需顯示字符首地址 b mov cx 29 c push cx mov cl si jcxz f ds si 0 轉(zhuǎn)到 f 執(zhí)行 d inc si pop cx loop c inc si mov al 0 mov si al 設(shè)置結(jié)尾符 0 mov si 0 設(shè)置 ds si 指向需顯示字符首地址 pop dx mov cl 2 call show str add bx 4 dword 數(shù)據(jù)指向下一數(shù)據(jù)單元 add di 2 word 數(shù)據(jù)指向下一數(shù)據(jù)單元 add dh 1 指向顯存下一行 pop cx loop g mov ax 4c00h int 21h f mov al 20h mov si al ds si 0 的數(shù)據(jù)改成空格 jmp d 名稱 dtoc2 功能 將 dword 型數(shù)據(jù)轉(zhuǎn)變?yōu)楸硎臼M(jìn)制的字符串 字符串以 0 為結(jié)尾符 參數(shù) ax dword 型數(shù)據(jù)的低 16 位 dx dword 型數(shù)據(jù)的高 16 位 ds si 指向字符串首地址 返回 無 dtoc2 push ax push bx push cx push dx push si push di mov di 0 d20 mov cx 10 除數(shù)為 10 call divdw add cx 30h 余數(shù) 30h 轉(zhuǎn)為字符 push cx 字符入棧 inc di 記錄字符個數(shù) mov cx ax jcxz d21 低位商 0 時 轉(zhuǎn)到 d21 檢測高位商 jmp d20 d21 mov cx dx jcxz d22 高低位商全 0 時 轉(zhuǎn)到 d22 執(zhí)行 jmp d20 d22 mov cx di d23 pop ax 字符出棧 mov si al inc si ds si 指向下一單元 loop d23 mov al 0 mov si al 設(shè)置結(jié)尾符 0 pop di pop si pop dx pop cx pop bx pop ax ret 名稱 divdw 功能 進(jìn)行不會產(chǎn)生溢出的除法運(yùn)算 被除數(shù)為 dword 型 除數(shù)為 word 型 結(jié)果為 dword 型 參數(shù) ax dword 型數(shù)據(jù)的低 16 位 dx dword 型數(shù)據(jù)的高 16 位 cx 除數(shù) 返回 dx 結(jié)果的高 16 位 ax 結(jié)果的低 16 位 cx 余數(shù) divdw push si push bx push ax mov ax dx mov dx 0 div cx 被除數(shù)的高位 cx mov si ax pop ax div cx 被除數(shù)高位的商 低位 cx mov cx dx 余數(shù)入 cx mov dx si 高位的商入 dx pop bx pop si ret 名稱 show str 功能 在指定的位置 用指定的顏色 顯示一個用 0 結(jié)束的字符串 參數(shù) dh 行號 取值范圍 0 24 dl 列號 取值范圍 0 79 cl 顏色 ds si 指向字符串的首地址 返回 無 show str push ax push bx push es push si mov ax 0b800h mov es ax mov ax 160 mul dh mov bx ax bx 160 dh mov ax 2 mul dl ax dl 2 add bx ax mov bx 160 dh dl 2 設(shè)置 es bx 指向顯存首地址 mov al cl 把顏色 cl 賦值 al mov cl 0 show0 mov ch si jcxz show1 ds si 0 時 轉(zhuǎn)到 show1 執(zhí)行 mov es bx ch mov es bx 1 al inc si ds si 指向下一個字符地址 add bx 2 es bx 指向下一個顯存地址 jmp show0 show1 pop si pop es pop bx pop ax ret code ends end start 檢測點(diǎn) 11 1 寫出下面每條指令執(zhí)行后 ZF PF SF 等標(biāo)志位的值 sub al al al 0h ZF 1 PF 1 SF 0 mov al 1 al 1h ZF 1 PF 1 SF 0 push ax ax 1h ZF 1 PF 1 SF 0 pop bx bx 1h ZF 1 PF 1 SF 0 add al bl al 2h ZF 0 PF 0 SF 0 add al 10 al 12h ZF 0 PF 1 SF 0 mul al ax 144h ZF 0 PF 1 SF 0 檢測點(diǎn)涉及的相關(guān)內(nèi)容 ZF 是 flag 的第 6 位 零標(biāo)志位 記錄指令執(zhí)行后結(jié)果是否為 0 結(jié)果為 0 時 ZF 1 PF 是 flag 的第 2 位 奇偶標(biāo)志位 記錄指令執(zhí)行后結(jié)果二進(jìn)制中 1 的個數(shù)是否為偶數(shù) 結(jié)果為偶數(shù)時 PF 1 SF 是 flag 的第 7 位 符號標(biāo)志位 記錄有符號運(yùn)算結(jié)果是否為負(fù)數(shù) 結(jié)果為負(fù)數(shù)時 SF 1 add sub mul div inc or and 等運(yùn)算指令影響標(biāo)志寄存器 mov push pop 等傳送指令對標(biāo)志寄存器沒影響 檢測點(diǎn) 11 2 寫出下面每條指令執(zhí)行后 ZF PF SF CF OF 等標(biāo)志位的值 al CF OF SF ZF PF sub al al 0h 0000 0000b 0 0 0 1 1 mov al 10h 10h 0010 0000b 0 0 0 1 1 add al 90h a0h 1010 0000b 0 0 1 0 1 mov al 80h 80h 1000 0000b 0 0 1 0 1 add al 80h 0h 0000 0000b 1 1 0 1 1 mov al 0fch 0fch 1111 1100b 1 1 0 1 1 add al 05h 1h 0000 0001b 1 0 0 0 0 mov al 7dh 7dh 1111 1101b 1 0 0 0 0 add al 0bh 88h 1000 1000b 0 1 1 0 1 檢測點(diǎn)涉及的相關(guān)內(nèi)容 ZF 是 flag 的第 6 位 零標(biāo)志位 記錄指令執(zhí)行后結(jié)果是否為 0 結(jié)果為 0 時 ZF 1 PF 是 flag 的第 2 位 奇偶標(biāo)志位 記錄指令執(zhí)行后結(jié)果二進(jìn)制數(shù)中 1 的個數(shù)是否為偶數(shù) 結(jié)果為偶數(shù)時 PF 1 SF 是 flag 的第 7 位 符號標(biāo)志位 記錄有符號運(yùn)算結(jié)果是否為負(fù)數(shù) 結(jié)果為負(fù)數(shù)時 SF 1 CF 是 flag 的第 0 位 進(jìn)位標(biāo)志位 記錄無符號運(yùn)算結(jié)果是否有進(jìn) 借位 結(jié)果有進(jìn) 借位時 SF 1 OF 是 flag 的第 11 位 溢出標(biāo)志位 記錄有符號運(yùn)算結(jié)果是否溢出 結(jié)果溢出時 OF 1 add sub mul div inc or and 等運(yùn)算指令影響 flag mov push pop 等傳送指令對 flag 沒影響 檢測點(diǎn) 11 3 1 補(bǔ)全下面的程序 統(tǒng)計(jì) F000 0 處 32 個字節(jié)中 大小在 32 128 的數(shù)據(jù)個數(shù) mov ax 0f000h mov ds ax mov bx 0 ds bx 指向第一個字節(jié) mov dx 0 初始化累加器 mov cx 32 s mov al bx cmp al 32 和 32 進(jìn)行比較 jb s0 如果低于 al 轉(zhuǎn)到 s0 繼續(xù)循環(huán) cmp al 128 和 128 進(jìn)行比較 ja s0 如果高于 al 轉(zhuǎn)到 s0 繼續(xù)循環(huán) inc dx s0 inc bx loop s 32 128 是閉區(qū)間 包括兩端點(diǎn)的值 32 128 是開區(qū)間 不包括兩端點(diǎn)的值 檢測點(diǎn) 11 3 2 補(bǔ)全下面的程序 統(tǒng)計(jì) F000 0 處 32 個字節(jié)中 大小在 32 128 的數(shù)據(jù)個數(shù) mov ax 0f000h mov ds ax mov bx 0 ds bx 指向第一個字節(jié) mov dx 0 初始化累加器 mov cx 32 s mov al bx cmp al 32 和 32 進(jìn)行比較 jna s0 如果不高于 al 轉(zhuǎn)到 s0 繼續(xù)循環(huán) cmp al 128 和 128 進(jìn)行比較 jnb s0 如果不低于 al 轉(zhuǎn)到 s0 繼續(xù)循環(huán) inc dx s0 inc bx loop s 32 128 是閉區(qū)間 包括兩端點(diǎn)的值 32 128 是開區(qū)間 不包括兩端點(diǎn)的值 檢測點(diǎn) 11 4 下面指令執(zhí)行后 ax 45h mov ax 0 push ax popf mov ax 0fff0h add ax 0010h pushf pop ax and al 11000101B and ah 00001000B 推算過程 popf 后 標(biāo)志寄存器中 本章節(jié)介紹的那些標(biāo)志位都為 0 但是此時標(biāo)志寄存器并不是所有位置都為 0 這個不用關(guān)心 沒學(xué)過的位置用 先代替 向下進(jìn)行 那么 pushf 將計(jì)算后的當(dāng)時狀態(tài)的標(biāo)志寄存器入棧 然后 pop 給 ax 這是 ax 是寄存器的值 這個值中包含了我們的 號 接下來就是對那些沒有學(xué)過的標(biāo)志 位的屏蔽操作 這就是最后兩條指令的意義所在 將不確定的位置都?xì)w 0 那么只剩下我們能夠確定的位 置了 所以 結(jié)果就可以推理出來了 mov ax 0 push ax popf mov ax 0fff0h add ax 0010h pushf pop ax 0 0 0 0 of df if tf sf zf 0 af 0 pf 0 cf 0 0 0 0 0 0 0 1 0 0 1 0 1 ax flag 000000 010 0101b and al 11000101B al 01000101b 45h and ah 00001000B ah 00000000b 0h C DOCUME 1 SNUSER debug a 0BF9 0100 mov ax 0 0BF9 0103 push ax 0BF9 0104 popf 0BF9 0105 mov ax fff0 0BF9 0108 add ax 10 0BF9 010B pushf 0BF9 010C pop ax 0BF9 010D and al c5 0BF9 010F and ah 8 0BF9 0112 r AX 0000 BX 0000 CX 0000 DX 0000 SP FFEE BP 0000 SI 0000 DI 0000 DS 0BF9 ES 0BF9 SS 0BF9 CS 0BF9 IP 0100 NV UP EI PL NZ NA PO NC 0BF9 0100 B80000 MOV AX 0000 t AX 0000 BX 0000 CX 0000 DX 0000 SP FFEE BP 0000 SI 0000 DI 0000 DS 0BF9 ES 0BF9 SS 0BF9 CS 0BF9 IP 0103 NV UP EI PL NZ NA PO NC 0BF9 0103 50 PUSH AX t AX 0000 BX 0000 CX 0000 DX 0000 SP FFEC BP 0000 SI 0000 DI 0000 DS 0BF9 ES 0BF9 SS 0BF9 CS 0BF9 IP 0104 NV UP EI PL NZ NA PO NC 0BF9 0104 9D POPF t AX 0000 BX 0000 CX 0000 DX 0000 SP FFEE BP 0000 SI 0000 DI 0000 DS 0BF9 ES 0BF9 SS 0BF9 CS 0BF9 IP 0105 NV UP DI PL NZ NA PO NC 0BF9 0105 B8F0FF MOV AX FFF0 t AX FFF0 BX 0000 CX 0000 DX 0000 SP FFEE BP 0000 SI 0000 DI 0000 DS 0BF9 ES 0BF9 SS 0BF9 CS 0BF9 IP 0108 NV UP DI PL NZ NA PO NC 0BF9 0108 051000 ADD AX 0010 t AX 0000 BX 0000 CX 0000 DX 0000 SP FFEE BP 0000 SI 0000 DI 0000 DS 0BF9 ES 0BF9 SS 0BF9 CS 0BF9 IP 010B NV UP DI PL ZR NA PE CY 0BF9 010B 9C PUSHF t AX 0000 BX 0000 CX 0000 DX 0000 SP FFEC BP 0000 SI 0000 DI 0000 DS 0BF9 ES 0BF9 SS 0BF9 CS 0BF9 IP 010C NV UP DI PL ZR NA PE CY 0BF9 010C 58 POP AX t AX 3047 BX 0000 CX 0000 DX 0000 SP FFEE BP 0000 SI 0000 DI 0000 DS 0BF9 ES 0BF9 SS 0BF9 CS 0BF9 IP 010D NV UP DI PL ZR NA PE CY 0BF9 010D 24C5 AND AL C5 t AX 3045 BX 0000 CX 0000 DX 0000 SP FFEE BP 0000 SI 0000 DI 0000 DS 0BF9 ES 0BF9 SS 0BF9 CS 0BF9 IP 010F NV UP DI PL NZ NA PO NC 0BF9 010F 80E408 AND AH 08 t AX 0045 BX 0000 CX 0000 DX 0000 SP FFEE BP 0000 SI 0000 DI 0000 DS 0BF9 ES 0BF9 SS 0BF9 CS 0BF9 IP 0112 NV UP DI PL ZR NA PE NC 0BF9 0112 4C DEC SP 檢測點(diǎn) 12 1 1 用 debug 查看內(nèi)存 情況如下 0000 0000 68 10 A7 00 8B 01 70 00 16 00 9D 03 8B 01 70 00 則 3 號中斷源對應(yīng)的中斷處理程序入口的偏移地址的內(nèi)存單位的地址為 0070 018b 檢測點(diǎn)涉及相關(guān)內(nèi)容 一個表項(xiàng)存放一個中斷向量 也就是一個中斷處理程序的入口地址 這個入口地址包括段地址和偏移地址 一個表項(xiàng)占兩個字 高地址存放段地址 低地址存放偏移地址 檢測點(diǎn) 12 1 2 存儲 N 號中斷源對應(yīng)的中斷處理程序入口的偏移地址的內(nèi)存單元的地址為 4N 存儲 N 號中斷源對應(yīng)的中斷處理程序入口的段地址的內(nèi)存單元的地址為 4N 2 檢測點(diǎn)涉及相關(guān)內(nèi)容 一個表項(xiàng)存放一個中斷向量 也就是一個中斷處理程序的入口地址 這個入口地址包括段地址和偏移地址 一個表項(xiàng)占兩個字 高地址存放段地址 低地址存放偏移地址 實(shí)驗(yàn) 11 letterc 子程序 小寫改成大寫 編寫一個子程序 將包含任意字符 以 0 結(jié)尾的字符串的小寫字母轉(zhuǎn)變成大寫字母 程序一 此題為小寫改成大寫 根據(jù)書 P141 頁介紹 小寫字母 a z 對應(yīng) ASCII 碼為 61h 86h 只要 61 86 這段區(qū)間里的 ASCII 減去 20h 就改成了大寫字母 assume cs codesg datasg segment db Seginner s All purpose Symbolic Instruction Code 0 datasg ends codesg segment begin mov ax datasg mov ds ax mov si 0 ds si 指向第一個字節(jié) call letterc mov ax 4c00h int 21h 名稱 letterc 功能 將以 0 結(jié)尾的字符中的小寫字母轉(zhuǎn)變成大寫字母 參數(shù) ds si 指向字符串首地址 letterc push ax push si let cmp byte ptr si 0 和 0 進(jìn)行比較 je let0 如果等于 0 則轉(zhuǎn)到 let0 結(jié)束 cmp byte ptr si 61h 和 61h 進(jìn)行比較 jb let1 如果低于 60h 則轉(zhuǎn)到 let1 繼續(xù)循環(huán) cmp byte ptr si 86h 和 86h 進(jìn)行比較 ja let1 如果高于 86h 則轉(zhuǎn)到 let1 繼續(xù)循環(huán) mov al si sub al 20h 轉(zhuǎn)為大寫字母 mov si al let1 inc si jmp let let0 pop si pop ax ret codesg ends end begin 華麗的分割線 程序二 參考書中 P143 頁內(nèi)容 有更好的辦法 無需用到寄存器 可以用 and 直接修改內(nèi)存 將 ASCII 碼的第 5 位置為 0 變?yōu)榇髮懽帜?assume cs codesg datasg segment db Seginner s All purpose Symbolic Instruction Code 0 datasg ends codesg segment begin mov ax datasg mov ds ax mov si 0 ds si 指向第一個字節(jié) call letterc mov ax 4c00h int 21h 名稱 letterc 功能 將以 0 結(jié)尾的字符中的小寫字母轉(zhuǎn)變成大寫字母 參數(shù) ds si 指向字符串首地址 letterc push si let cmp byte ptr si 0 和 0 進(jìn)行比較 je let0 如果等于 0 則轉(zhuǎn)到 let0 結(jié)束 cmp byte ptr si 61h 和 61h 進(jìn)行比較 jb let1 如果低于 60h 則轉(zhuǎn)到 let1 繼續(xù)循環(huán) cmp byte ptr si 86h 和 86h 進(jìn)行比較 ja let1 如果高于 86h 則轉(zhuǎn)到 let1 繼續(xù)循環(huán) and byte ptr si 11011111b ASCII 碼的第 5 位置為 0 轉(zhuǎn)為大寫 let1 inc si jmp let let0 pop si ret codesg ends end begin 檢測點(diǎn) 13 1 7ch 中斷例程如下 lp push bp mov bp sp dec cx jcxz lpret add bp 2 bx lpret pop bp iret 1 在上面的內(nèi)容中 我們用 7ch 中斷例程實(shí)現(xiàn) loop 的功能 則上面的 7ch 中斷例程所能進(jìn)行的最大轉(zhuǎn) 移位移是多少 最大位移是 FFFFH 檢測點(diǎn) 13 1 2 用 7ch 中斷例程完成 jmp near ptr s 指令功能 用 bx 向中斷例程傳送轉(zhuǎn)移位移 應(yīng)用舉例 在屏幕的第 12 行 顯示 data 段中以 0 結(jié)尾的字符串 assume cs code data segment db conversation 0 data ends code segment start mov ax data mov ds ax mov si 0 mov ax 0b800h mov es ax mov di 12 160 s cmp byte ptr si 0 je ok mov al si mov es di al inc si add di 2 mov bx offset s offset ok int 7ch ok mov ax 4c00h int 21h code ends end start jmp near ptr s 指令的功能為 ip ip 16 位移 實(shí)現(xiàn)段內(nèi)近轉(zhuǎn)移 檢測點(diǎn) 13 2 判斷下面說法的正誤 1 我們可以編程改變 FFFF 0 處的指令 使得 CPU 不去執(zhí)行 BIOS 中的硬件系統(tǒng)檢測和初始化程序 答 錯誤 FFFF 0 處的內(nèi)容無法改變 檢測點(diǎn) 13 2 判斷下面說法的正誤 2 int 19h 中斷例程 可以由 DOS 提供 答 錯誤 先調(diào)用 int 19h 后啟動 DOS 實(shí)驗(yàn) 13 1 編寫并安裝 int 7ch 中斷例程 功能為顯示一個用 0 結(jié)束的字符串 中斷例程安裝在 0 200 處 名稱 int 7ch 中斷例程 功能 顯示一個 0 結(jié)束的字符串 中斷例程安裝在 0 200 處 參數(shù) dh 行號 dl 列號 cl 顏色 ds si 指向字符串首地址 assume cs code code segment start mov ax cs mov ds ax mov si offset show str 設(shè)置 ds si 指向源地址 mov ax 0 mov es ax mov di 200h 設(shè)置 es di 指向目標(biāo)地址 mov cx offset show strend offset show str 設(shè)置 cx 為傳輸長度 cld 設(shè)置傳輸方向?yàn)檎?rep movsb mov ax 0 mov es ax mov word ptr es 7ch 4 200h mov word ptr es 7ch 4 2 0 設(shè)置中斷向量表 mov ax 4c00h int 21h 名稱 show str 功能 在指定的位置 用指定的顏色 顯示一個用 0 結(jié)束的字符串 參數(shù) dh 行號 取值范圍 0 24 dl 列號 取值范圍 0 79 cl 顏色 ds si 指向字符串的首地址 返回 無 show str push ax push bx push es push si mov ax 0b800h mov es ax mov ax 160 mul dh mov bx ax bx 160 dh mov ax 2 mul dl ax dl 2 add bx ax mov bx 160 dh dl 2 設(shè)置 es bx 指向顯存首地址 mov al cl 把顏色 cl 賦值 al mov cl 0 show0 mov ch si jcxz show1 ds si 0 時 轉(zhuǎn)到 show1 執(zhí)行 mov es bx ch mov es bx 1 al inc si ds si 指向下一個字符地址 add bx 2 es bx 指向下一個顯存地址 jmp show0 show1 pop si pop es pop bx pop ax iret mov ax 4c00h int 21h show strend nop code ends end start 實(shí)驗(yàn) 13 1 應(yīng)用舉例 assume cs code data segment db welcome to masm 0 data ends code segment start mov dh 10 mov dl 10 mov cl 2 mov ax data mov ds ax mov si 0 int 7ch mov ax 4c00h int 21h code ends end start 實(shí)驗(yàn) 13 2 編寫并安裝 int 7ch 中斷例程 功能為完成 loop 指令功能 名稱 int 7ch 中斷例程 功能 完成 loop 指令功能 中斷例程安裝在 0 200 處 參數(shù) cx 循環(huán)次數(shù) bx 位移 assume cs code code segment start mov ax cs mov ds ax mov si offset lp 設(shè)置 ds si 指向源地址 mov ax 0 mov es ax mov di 200h 設(shè)置 es di 指向目標(biāo)地址 mov cx offset lpend offset lp 設(shè)置 cx 為傳輸長度 cld 設(shè)置傳輸方向?yàn)檎?rep movsb mov ax 0 mov es ax mov word ptr es 7ch 4 200h mov word ptr es 7ch 4 2 0 設(shè)置中斷向量表 mov ax 4c00h int 21h lp push bp mov bp sp dec cx jcxz lpret add bp 2 bx lpret pop bp iret mov ax 4c00h int 21h lpend nop code ends end start 實(shí)驗(yàn) 13 2 應(yīng)用舉例 assume cs code code segment start mov ax 0b800h mov es ax mov di 160 12 mov bx offset s offset se 設(shè)置從標(biāo)號 se 到標(biāo)號 s 的轉(zhuǎn)移位移 mov cx 80 s mov byte ptr es di add di 2 int 7ch cx 0 轉(zhuǎn)移到標(biāo)號 s 處 se nop mov ax 4c00h int 21h code ends end start 實(shí)驗(yàn) 13 3 下面的程序 分別在屏幕的第 2 4 6 8 行顯示 4 句英文詩 補(bǔ)全代碼 assume cs code code segment s1 db Good better best s2 db Never let it rest s3 db Till good is better s4 db And better best s dw offset s1 offset s2 offset s3 offset s4 row db 2 4 6 8 start mov ax cs mov ds ax mov bx offset s mov si offset row mov cx 4 ok mov bh 0 第 0 頁 mov dh si dh 中放行號 mov dl 0 dl 中放列號 mov ah 2 置光標(biāo) int 10h mov dx bx ds dx 指向字符串首地址 mov ah 9 在光標(biāo)位置顯示字符 int 21h inc si 行號遞增 add bx 2 指向下一字符串 loop ok mov ax 4c00h int 21h code ends end start 檢測點(diǎn) 14 1 讀取寫入 CMOS RAM 單元內(nèi)容 1 編程 讀取 CMOS RAM 的 2 號單元內(nèi)容 assume cs code code segment start mov al 2 賦值 al out 70h al 將 al 送入端口 70h in al 71h 從端口 71h 處讀出單元內(nèi)容 mov ax 4c00h int 21h code ends end start 檢測點(diǎn) 14 1 2 編程 向 CMOS RAM 的 2 號單元寫入 0 assume cs code code segment start mov al 2 賦值 al out 70h al 將 al 送入端口 70h mov al 0 賦值 al out 71h al 向端口 71h 寫入數(shù)據(jù) al mov ax 4c00h int 21h code ends end start 檢測點(diǎn) 14 2 用加法和移位指令計(jì)算 編程 用加法和移位指令計(jì)算 ax ax 10 提示 ax 10 ax 2 ax 8 assume cs code code segment start mov bx ax shl ax 1 左移 1 位 ax ax 2 mov cl 3 shl bx cl 左移 3 位 bx ax 8 add ax bx ax ax 2 ax 8 mov ax 4c00h int 21h code ends end start 應(yīng)用舉例 計(jì)算 ffh 10 assume cs code code segment start mov ax 0ffh mov bx ax shl ax 1 左移 1 位 ax ax 2 mov cl 3 shl bx cl 左移 3 位 bx ax 8 add ax bx ax ax 2 ax 8 mov ax 4c00h int 21h code ends end start PS 左移 1 位 N N 2 左移 2 位 N N 4 左移 3 位 N N 8 左移 4 位 N N 16 左移 5 位 N N 32 實(shí)驗(yàn) 14 訪問 CMOS RAM 編程 以 年 月 日 時 分 秒 的格式 顯示當(dāng)前的日期 時間 兩個程序 程序一 assume cs code code segment start mov ax 0 mov al 9 mov si 0 mov cx 6 s push cx push ax out 70h al 將 al 送入端口 70h in al 71h 從端口 71h 處讀出單元內(nèi)容 mov ah al mov cl 4 shr ah cl and al 00001111b al 分成兩個表示 BCD 碼值的數(shù)據(jù) add ah 30h add al 30h BCD 碼 30h 10 進(jìn)制數(shù)對應(yīng)的 ASCII 碼 mov bx 0b800h mov es bx mov byte ptr es 160 12 40 2 si ah 顯示十位數(shù)碼 mov byte ptr es 160 12 40 2 2 si al 顯示個位數(shù)碼 pop ax dec ax 指向前一數(shù)據(jù)單元 jmp s1 s0 pop cx add si 6 loop s mov ax 4c00h int 21h s1 cmp ax 10 ja s0 cmp ax 0 je s0 cmp ax 6 ja s2 ax 6 為年 月 日 je s3 ax 6 為日結(jié)尾 jb s4 axdebug 16 1 exe u 0C4E 0014 BE0000 MOV SI 0000 0C4E 0017 B90800 MOV CX 0008 0C4E 001A 2E CS 0C4E 001B 8B840000 MOV AX SI 0000 0C4E 001F 2E CS 0C4E 0020 01061000 ADD 0010 AX 0C4E 0024 2E CS 0C4E 0025 8316120000 ADC WORD PTR 0012 00 0C4E 002A 83C602 ADD SI 02 0C4E 002D E2EB LOOP 001A 0C4E 002F B8004C MOV AX 4C00 0C4E 0032 CD21 INT 21 r AX 0000 BX 0000 CX 0034 DX 0000 SP 0000 BP 0000 SI 0000 DI 0000 DS 0C3E ES 0C3E SS 0C4E CS 0C4E IP 0014 NV UP EI PL NZ NA PO NC 0C4E 0014 BE0000 MOV SI 0000 d 0c4e 0 1f 0C4E 0000 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 0C4E 0010 00 00 00 00 BE 00 00 B9 08 00 2E 8B 84 00 00 2E g002f AX 0008 BX 0000 CX 0000 DX 0000 SP 0000 BP 0000 SI 0010 DI 0000 DS 0C3E ES 0C3E SS 0C4E CS 0C4E IP 002F NV UP EI PL NZ AC PO NC 0C4E 002F B8004C MOV AX 4C00 d 0c4e 0 1f 0C4E 0000 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 0C4E 0010 24 00 00 00 BE 00 00 B9 08 00 2E 8B 84 00 00 2E 程序二 assume cs code code segment a dw 1 2 3 4 5 6 7 8 b dd 0 start mov si 0 mov cx 8 s mov ax a si add word ptr b 0 ax adc word ptr b 2 0 add si 2 loop s mov ax 4c00h int 21h code ends end start 檢測點(diǎn) 16 2 下面的程序?qū)?data 段中 a 處的 8 個數(shù)值累加 結(jié)果存儲到 b 處的雙字節(jié)中 補(bǔ)全程序 assume cs code es data data segment a db 1 2 3 4 5 6 7 8 b dw 0 data ends code segment start mov ax data mov es ax mov si 0 mov cx 8 s mov al a si mov ah 0 add b ax inc si loop s mov ax 4c00h int 21h code ends end start C DOCUME 1 SNUSER debug 16 2 exe u 0C4F 0000 B84E0C MOV AX 0C4E 0C4F 0003 8EC0 MOV ES AX 0C4F 0005 BE0000 MOV SI 0000 0C4F 0008 B90800 MOV CX 0008 0C4F 000B 26 ES 0C4F 000C 8A840000 MOV AL SI 0000 0C4F 0010 B400 MOV AH 00 0C4F 0012 26 ES 0C4F 0013 01060800 ADD 0008 AX 0C4F 0017 46 INC SI 0C4F 0018 E2F1 LOOP 000B 0C4F 001A B8004C MOV AX 4C00 0C4F 001D CD21 INT 21 0C4F 001F 56 PUSH SI r AX 0000 BX 0000 CX 002F DX 0000 SP 0000 BP 0000 SI 0000 DI 0000 DS 0C3E ES 0C3E SS 0C4E CS 0C4F IP 0000 NV UP EI PL NZ NA PO NC 0C4F 0000 B84E0C MOV AX 0C4E d 0c4e 0 f 0C4E 0000 01 02 03 04 05 06 07 08 00 00 00 00 00 00 00 00 g001a AX 0008 BX 0000 CX 0000 DX 0000 SP 0000 BP 0000 SI 0008 DI 0000 DS 0C3E ES 0C4E SS 0C4E CS 0C4F IP 001A NV UP EI PL NZ NA PO NC 0C4F 001A B8004C MOV AX 4C00 d 0c4e 0 f 0C4E 0000 01 02 03 04 05 06 07 08 24 00 00 00 00 00 00 00 實(shí)驗(yàn) 16 包含多個功能子程序的中斷例程 兩個程序 安裝一個新的 int 7ch 中斷例程 為顯示輸出提供功能子程序 1 清屏 2 設(shè)置前景色 3 設(shè)置背景色 4 向上滾動一行 入口參數(shù)說明如下 1 用 ah 寄存器傳遞功能號 0 表示清屏 1 表示設(shè)置前景色 2 表示設(shè)置背景色 3 表示向上滾動一行 2 對于 2 3 號功能 用 al 傳送顏色值 al 0 1 2 3 4 5 6 7 程序一 任務(wù) 安裝一個新的 int 7ch 中斷例程 功能 為顯示輸出提供功能子程序 參數(shù) ah 傳遞功能號 0 表示清屏 1 表示設(shè)置前景色 2 表示設(shè)置背景色 3 表示向上滾動一行 對于 2 3 號功能 用 al 傳送顏色值 al 0 1 2 3 4 5 6 7 assume cs code code segment start mov ax cs mov ds ax mov si offset s 設(shè)置 ds si 指向源地址 mov ax 0 mov es ax mov di 200h 設(shè)置 es di 指向目標(biāo)地址 mov cx offset send offset s 設(shè)置 cx 為傳輸長度 cld 設(shè)置傳輸方向?yàn)檎?rep movsb 在中斷向量表中設(shè)置新的 int 7ch 中斷例程的入口地址 cli 設(shè)置 IF 0 屏蔽中斷 mov word ptr es 7ch 4 200h mov word ptr es 7ch 4 2 0 sti 設(shè)置 IF 1 不屏蔽中斷 結(jié)束 mov ax 4c00h int 21h 新的 int 7ch 中斷例程 s jmp short set table dw sub1 s 200h sub2 s 200h sub3 s 200h sub4 s 200h set push bx cmp ah 3 判斷 ah 中的功能號是否大于 3 ja sret mov bl ah mov bh 0 add bx bx 計(jì)算對應(yīng)子程序在 table 表中的偏移 call word ptr table bx 調(diào)用對應(yīng)的功能子程序 sret pop bx iret 功能 清屏 sub1 push bx push cx push es mov bx 0b800h mov es bx mov bx 0 mov cx 2000 subles mov byte ptr es bx add bx 2 loop subles pop es pop cx pop bx ret 設(shè)置前景色 al 傳送顏色值 al 0 1 2 3 4 5 6 7 sub2 push bx push cx push es mov bx 0b800h mov es bx mov bx 1 mov cx 2000 sub2s and byte ptr es bx 11111000b or es bx al add bx 2 loop sub2s pop es pop cx pop bx ret 設(shè)置背景色 al 傳送顏色值 al 0 1 2 3 4 5 6 7 sub3 push ax push bx push cx push es mov cl 4 shl al cl mov bx 0b800h mov es bx mov bx 1 mov cx 2000 sub3s and byte ptr es bx 10001111b or es bx al add bx 2 loop sub3s pop es pop cx pop bx pop ax ret 向上滾動一行 sub4 push cx push si push di push es push ds mov si 0b800h mov es si mov ds si mov si 160 ds si 指向第 N 1 行 mov di 0 es di 指向第 N- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
15 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 匯編語言課后習(xí)題答案 王爽主編 匯編語言 課后 習(xí)題 答案 主編
鏈接地址:http://kudomayuko.com/p-9735810.html