汇编语言课后习题答案 王爽主编

上传人:xgs****56 文档编号:9735810 上传时间:2020-04-07 格式:DOC 页数:50 大小:81.23KB
返回 下载 相关 举报
汇编语言课后习题答案 王爽主编_第1页
第1页 / 共50页
汇编语言课后习题答案 王爽主编_第2页
第2页 / 共50页
汇编语言课后习题答案 王爽主编_第3页
第3页 / 共50页
点击查看更多>>
资源描述
检测点 9 2 补全编程 利用 jcxz 指令 实现在内存 2000H 段中查找第一个值为 0 的字节 找到后 将它的偏移地址 存储在 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 当 cx 0 时 CS IP 指向 OK inc bx jmp short s ok mov dx bx mov ax 4c00h int 21h code ends end start 检测点 9 3 补全编程 利用 loop 指令 实现在内存 2000H 段中查找第一个值为 0 的字节 找到后 将它的偏移地址 存储在 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 执行 loop s 时 首先要将 cx 减 1 loop 标号 相当于 dec cx if cx 0 jmp short 标号 检测点 10 1 补全程序 实现从内存 1000 0000 处开始执行指令 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 执行 reft 指令时 相当于进行 pop ip pop cs 根据栈先进后出原则 应先将段地址 cs 入栈 再将偏移地址 ip 入栈 检测点 10 3 下面的程序执行后 ax 中的数值为多少 内存地址 机器码 汇编指令 执行后情况 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 进行跟踪确认 call far ptr s 是先将该指令后的第一个字节段地址 cs 1000h 入栈 再将偏 移地址 ip 8h 入栈 最后转到标号处执行指令 出栈时 根据栈先进后出的原则 先出的为 ip 8h 后出的为 cs 1000h 检测点 10 4 下面的程序执行后 ax 中的数值为多少 内存地址 机器码 汇编指令 执行后情况 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 进行跟踪确认 call ax 16 位 reg 是先将该指令后的第一个字节偏移地址 ip 入栈 再转到 偏移地址为 ax 16 位 reg 处执行指令 检测点 10 5 1 下面的程序执行后 ax 中的数值为多少 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 推算 执行 call word ptr ds 0eh 指令时 先 cs 入栈 再 ip 11 入栈 最后 ip 转移到 ds 0eh ds 0eh 11h 执行 inc ax 最终 ax 3 题中特别关照别用 debug 跟踪 跟踪结果不一定正确 但还是忍不住去试试 看是什么结果 根据单步跟踪发现 执行 call word ptr ds 0eh 指令时 显示 ds 0eh 065D ds 0000 ds 0010 不是已设置成 stack 数据段了嘛 不是应该全都是 0 的嘛 于是进行了更详细的单步跟踪 发现初始数据段中数据确实为 0 但执行完 mov ss ax mov sp 16 这两 条指令后 数据段中数据发生改变 这是为什么呢 中断呗 检测点 10 5 2 下面的程序执行后 ax 和 bx 中的数值为多少 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 入栈 转到 cs 1ah 处执行指令 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 课程设计一 将实验 7 中的 Power idea 公司的数据按照图所示的格式在屏幕上显示现来 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 收入转成十进制字符入 ds si add si 10 mov ax es di 168 mov dx 0 call dtoc2 人员数转成十进制字符入 ds si add si 6 mov ax es di 210 mov dx 0 call dtoc2 人均收入转成十进制字符入 ds si mov si 0 设置 ds si 指向需显示字符首地址 b mov cx 29 c push cx mov cl si jcxz f ds si 0 转到 f 执行 d inc si pop cx loop c inc si mov al 0 mov si al 设置结尾符 0 mov si 0 设置 ds si 指向需显示字符首地址 pop dx mov cl 2 call show str add bx 4 dword 数据指向下一数据单元 add di 2 word 数据指向下一数据单元 add dh 1 指向显存下一行 pop cx loop g mov ax 4c00h int 21h f mov al 20h mov si al ds si 0 的数据改成空格 jmp d 名称 dtoc2 功能 将 dword 型数据转变为表示十进制的字符串 字符串以 0 为结尾符 参数 ax dword 型数据的低 16 位 dx dword 型数据的高 16 位 ds si 指向字符串首地址 返回 无 dtoc2 push ax push bx push cx push dx push si push di mov di 0 d20 mov cx 10 除数为 10 call divdw add cx 30h 余数 30h 转为字符 push cx 字符入栈 inc di 记录字符个数 mov cx ax jcxz d21 低位商 0 时 转到 d21 检测高位商 jmp d20 d21 mov cx dx jcxz d22 高低位商全 0 时 转到 d22 执行 jmp d20 d22 mov cx di d23 pop ax 字符出栈 mov si al inc si ds si 指向下一单元 loop d23 mov al 0 mov si al 设置结尾符 0 pop di pop si pop dx pop cx pop bx pop ax ret 名称 divdw 功能 进行不会产生溢出的除法运算 被除数为 dword 型 除数为 word 型 结果为 dword 型 参数 ax dword 型数据的低 16 位 dx dword 型数据的高 16 位 cx 除数 返回 dx 结果的高 16 位 ax 结果的低 16 位 cx 余数 divdw push si push bx push ax mov ax dx mov dx 0 div cx 被除数的高位 cx mov si ax pop ax div cx 被除数高位的商 低位 cx mov cx dx 余数入 cx mov dx si 高位的商入 dx pop bx pop si ret 名称 show str 功能 在指定的位置 用指定的颜色 显示一个用 0 结束的字符串 参数 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 设置 es bx 指向显存首地址 mov al cl 把颜色 cl 赋值 al mov cl 0 show0 mov ch si jcxz show1 ds si 0 时 转到 show1 执行 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 检测点 11 1 写出下面每条指令执行后 ZF PF SF 等标志位的值 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 检测点涉及的相关内容 ZF 是 flag 的第 6 位 零标志位 记录指令执行后结果是否为 0 结果为 0 时 ZF 1 PF 是 flag 的第 2 位 奇偶标志位 记录指令执行后结果二进制中 1 的个数是否为偶数 结果为偶数时 PF 1 SF 是 flag 的第 7 位 符号标志位 记录有符号运算结果是否为负数 结果为负数时 SF 1 add sub mul div inc or and 等运算指令影响标志寄存器 mov push pop 等传送指令对标志寄存器没影响 检测点 11 2 写出下面每条指令执行后 ZF PF SF CF OF 等标志位的值 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 检测点涉及的相关内容 ZF 是 flag 的第 6 位 零标志位 记录指令执行后结果是否为 0 结果为 0 时 ZF 1 PF 是 flag 的第 2 位 奇偶标志位 记录指令执行后结果二进制数中 1 的个数是否为偶数 结果为偶数时 PF 1 SF 是 flag 的第 7 位 符号标志位 记录有符号运算结果是否为负数 结果为负数时 SF 1 CF 是 flag 的第 0 位 进位标志位 记录无符号运算结果是否有进 借位 结果有进 借位时 SF 1 OF 是 flag 的第 11 位 溢出标志位 记录有符号运算结果是否溢出 结果溢出时 OF 1 add sub mul div inc or and 等运算指令影响 flag mov push pop 等传送指令对 flag 没影响 检测点 11 3 1 补全下面的程序 统计 F000 0 处 32 个字节中 大小在 32 128 的数据个数 mov ax 0f000h mov ds ax mov bx 0 ds bx 指向第一个字节 mov dx 0 初始化累加器 mov cx 32 s mov al bx cmp al 32 和 32 进行比较 jb s0 如果低于 al 转到 s0 继续循环 cmp al 128 和 128 进行比较 ja s0 如果高于 al 转到 s0 继续循环 inc dx s0 inc bx loop s 32 128 是闭区间 包括两端点的值 32 128 是开区间 不包括两端点的值 检测点 11 3 2 补全下面的程序 统计 F000 0 处 32 个字节中 大小在 32 128 的数据个数 mov ax 0f000h mov ds ax mov bx 0 ds bx 指向第一个字节 mov dx 0 初始化累加器 mov cx 32 s mov al bx cmp al 32 和 32 进行比较 jna s0 如果不高于 al 转到 s0 继续循环 cmp al 128 和 128 进行比较 jnb s0 如果不低于 al 转到 s0 继续循环 inc dx s0 inc bx loop s 32 128 是闭区间 包括两端点的值 32 128 是开区间 不包括两端点的值 检测点 11 4 下面指令执行后 ax 45h mov ax 0 push ax popf mov ax 0fff0h add ax 0010h pushf pop ax and al 11000101B and ah 00001000B 推算过程 popf 后 标志寄存器中 本章节介绍的那些标志位都为 0 但是此时标志寄存器并不是所有位置都为 0 这个不用关心 没学过的位置用 先代替 向下进行 那么 pushf 将计算后的当时状态的标志寄存器入栈 然后 pop 给 ax 这是 ax 是寄存器的值 这个值中包含了我们的 号 接下来就是对那些没有学过的标志 位的屏蔽操作 这就是最后两条指令的意义所在 将不确定的位置都归 0 那么只剩下我们能够确定的位 置了 所以 结果就可以推理出来了 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 检测点 12 1 1 用 debug 查看内存 情况如下 0000 0000 68 10 A7 00 8B 01 70 00 16 00 9D 03 8B 01 70 00 则 3 号中断源对应的中断处理程序入口的偏移地址的内存单位的地址为 0070 018b 检测点涉及相关内容 一个表项存放一个中断向量 也就是一个中断处理程序的入口地址 这个入口地址包括段地址和偏移地址 一个表项占两个字 高地址存放段地址 低地址存放偏移地址 检测点 12 1 2 存储 N 号中断源对应的中断处理程序入口的偏移地址的内存单元的地址为 4N 存储 N 号中断源对应的中断处理程序入口的段地址的内存单元的地址为 4N 2 检测点涉及相关内容 一个表项存放一个中断向量 也就是一个中断处理程序的入口地址 这个入口地址包括段地址和偏移地址 一个表项占两个字 高地址存放段地址 低地址存放偏移地址 实验 11 letterc 子程序 小写改成大写 编写一个子程序 将包含任意字符 以 0 结尾的字符串的小写字母转变成大写字母 程序一 此题为小写改成大写 根据书 P141 页介绍 小写字母 a z 对应 ASCII 码为 61h 86h 只要 61 86 这段区间里的 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 指向第一个字节 call letterc mov ax 4c00h int 21h 名称 letterc 功能 将以 0 结尾的字符中的小写字母转变成大写字母 参数 ds si 指向字符串首地址 letterc push ax push si let cmp byte ptr si 0 和 0 进行比较 je let0 如果等于 0 则转到 let0 结束 cmp byte ptr si 61h 和 61h 进行比较 jb let1 如果低于 60h 则转到 let1 继续循环 cmp byte ptr si 86h 和 86h 进行比较 ja let1 如果高于 86h 则转到 let1 继续循环 mov al si sub al 20h 转为大写字母 mov si al let1 inc si jmp let let0 pop si pop ax ret codesg ends end begin 华丽的分割线 程序二 参考书中 P143 页内容 有更好的办法 无需用到寄存器 可以用 and 直接修改内存 将 ASCII 码的第 5 位置为 0 变为大写字母 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 指向第一个字节 call letterc mov ax 4c00h int 21h 名称 letterc 功能 将以 0 结尾的字符中的小写字母转变成大写字母 参数 ds si 指向字符串首地址 letterc push si let cmp byte ptr si 0 和 0 进行比较 je let0 如果等于 0 则转到 let0 结束 cmp byte ptr si 61h 和 61h 进行比较 jb let1 如果低于 60h 则转到 let1 继续循环 cmp byte ptr si 86h 和 86h 进行比较 ja let1 如果高于 86h 则转到 let1 继续循环 and byte ptr si 11011111b ASCII 码的第 5 位置为 0 转为大写 let1 inc si jmp let let0 pop si ret codesg ends end begin 检测点 13 1 7ch 中断例程如下 lp push bp mov bp sp dec cx jcxz lpret add bp 2 bx lpret pop bp iret 1 在上面的内容中 我们用 7ch 中断例程实现 loop 的功能 则上面的 7ch 中断例程所能进行的最大转 移位移是多少 最大位移是 FFFFH 检测点 13 1 2 用 7ch 中断例程完成 jmp near ptr s 指令功能 用 bx 向中断例程传送转移位移 应用举例 在屏幕的第 12 行 显示 data 段中以 0 结尾的字符串 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 位移 实现段内近转移 检测点 13 2 判断下面说法的正误 1 我们可以编程改变 FFFF 0 处的指令 使得 CPU 不去执行 BIOS 中的硬件系统检测和初始化程序 答 错误 FFFF 0 处的内容无法改变 检测点 13 2 判断下面说法的正误 2 int 19h 中断例程 可以由 DOS 提供 答 错误 先调用 int 19h 后启动 DOS 实验 13 1 编写并安装 int 7ch 中断例程 功能为显示一个用 0 结束的字符串 中断例程安装在 0 200 处 名称 int 7ch 中断例程 功能 显示一个 0 结束的字符串 中断例程安装在 0 200 处 参数 dh 行号 dl 列号 cl 颜色 ds si 指向字符串首地址 assume cs code code segment start mov ax cs mov ds ax mov si offset show str 设置 ds si 指向源地址 mov ax 0 mov es ax mov di 200h 设置 es di 指向目标地址 mov cx offset show strend offset show str 设置 cx 为传输长度 cld 设置传输方向为正 rep movsb mov ax 0 mov es ax mov word ptr es 7ch 4 200h mov word ptr es 7ch 4 2 0 设置中断向量表 mov ax 4c00h int 21h 名称 show str 功能 在指定的位置 用指定的颜色 显示一个用 0 结束的字符串 参数 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 设置 es bx 指向显存首地址 mov al cl 把颜色 cl 赋值 al mov cl 0 show0 mov ch si jcxz show1 ds si 0 时 转到 show1 执行 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 实验 13 1 应用举例 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 实验 13 2 编写并安装 int 7ch 中断例程 功能为完成 loop 指令功能 名称 int 7ch 中断例程 功能 完成 loop 指令功能 中断例程安装在 0 200 处 参数 cx 循环次数 bx 位移 assume cs code code segment start mov ax cs mov ds ax mov si offset lp 设置 ds si 指向源地址 mov ax 0 mov es ax mov di 200h 设置 es di 指向目标地址 mov cx offset lpend offset lp 设置 cx 为传输长度 cld 设置传输方向为正 rep movsb mov ax 0 mov es ax mov word ptr es 7ch 4 200h mov word ptr es 7ch 4 2 0 设置中断向量表 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 实验 13 2 应用举例 assume cs code code segment start mov ax 0b800h mov es ax mov di 160 12 mov bx offset s offset se 设置从标号 se 到标号 s 的转移位移 mov cx 80 s mov byte ptr es di add di 2 int 7ch cx 0 转移到标号 s 处 se nop mov ax 4c00h int 21h code ends end start 实验 13 3 下面的程序 分别在屏幕的第 2 4 6 8 行显示 4 句英文诗 补全代码 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 置光标 int 10h mov dx bx ds dx 指向字符串首地址 mov ah 9 在光标位置显示字符 int 21h inc si 行号递增 add bx 2 指向下一字符串 loop ok mov ax 4c00h int 21h code ends end start 检测点 14 1 读取写入 CMOS RAM 单元内容 1 编程 读取 CMOS RAM 的 2 号单元内容 assume cs code code segment start mov al 2 赋值 al out 70h al 将 al 送入端口 70h in al 71h 从端口 71h 处读出单元内容 mov ax 4c00h int 21h code ends end start 检测点 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 写入数据 al mov ax 4c00h int 21h code ends end start 检测点 14 2 用加法和移位指令计算 编程 用加法和移位指令计算 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 应用举例 计算 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 实验 14 访问 CMOS RAM 编程 以 年 月 日 时 分 秒 的格式 显示当前的日期 时间 两个程序 程序一 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 处读出单元内容 mov ah al mov cl 4 shr ah cl and al 00001111b al 分成两个表示 BCD 码值的数据 add ah 30h add al 30h BCD 码 30h 10 进制数对应的 ASCII 码 mov bx 0b800h mov es bx mov byte ptr es 160 12 40 2 si ah 显示十位数码 mov byte ptr es 160 12 40 2 2 si al 显示个位数码 pop ax dec ax 指向前一数据单元 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 为日结尾 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 检测点 16 2 下面的程序将 data 段中 a 处的 8 个数值累加 结果存储到 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 实验 16 包含多个功能子程序的中断例程 两个程序 安装一个新的 int 7ch 中断例程 为显示输出提供功能子程序 1 清屏 2 设置前景色 3 设置背景色 4 向上滚动一行 入口参数说明如下 1 用 ah 寄存器传递功能号 0 表示清屏 1 表示设置前景色 2 表示设置背景色 3 表示向上滚动一行 2 对于 2 3 号功能 用 al 传送颜色值 al 0 1 2 3 4 5 6 7 程序一 任务 安装一个新的 int 7ch 中断例程 功能 为显示输出提供功能子程序 参数 ah 传递功能号 0 表示清屏 1 表示设置前景色 2 表示设置背景色 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 设置 ds si 指向源地址 mov ax 0 mov es ax mov di 200h 设置 es di 指向目标地址 mov cx offset send offset s 设置 cx 为传输长度 cld 设置传输方向为正 rep movsb 在中断向量表中设置新的 int 7ch 中断例程的入口地址 cli 设置 IF 0 屏蔽中断 mov word ptr es 7ch 4 200h mov word ptr es 7ch 4 2 0 sti 设置 IF 1 不屏蔽中断 结束 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 计算对应子程序在 table 表中的偏移 call word ptr table bx 调用对应的功能子程序 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 设置前景色 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 设置背景色 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
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!