




已阅读5页,还剩66页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验实验1 1 查看查看 CPUCPU 和内存 用机器指令和汇编指令编程和内存 用机器指令和汇编指令编程 1 预备知识 Debug 的使用 2 实验任务 第45页 1 已跟踪执行 2 3 通过 DEBUG 中的 D 命令查看到主板的生产日期 以月 日 年 分隔符为 的格式 存 储在内存 ffff 0005 ffff 000C 共8个字节单元中 处 此生产日期不能被改变 因为其具 有 只读 属性 4 通过向内存中的显存写入数据 使计算机根据写入的数据进行 ASCII 转换 并将转换后 且可打印的字符输出到屏幕上 5 实验实验2 2 用机器指令和汇编指令编程用机器指令和汇编指令编程 1 预备知识 Debug 的使用 2 实验任务 第71页 1 使用 Debug 将下面的程序段写入内存 逐条执行 根据指令执行后的实际运行情况填 空 从第一空开始依次如下 ax 5BEA ax 5CCA bx 30F0 bx 6022 sp FE 220FE 5CCA sp FC 220FC 6022 sp FE 6022 sp 100H 5CCA sp FE 220FE 30F0 sp FC 220FC 2F32 说明 此题可能因机子软 硬件环境不同而导致答案不一致 2 仔细观察图3 19的实验过程 然后分析 为什么2000 0 2000 f 中的内容会发生改变 答 因为用 T 指令进行调试时 会产生中断 而为了保护现场 CPU 则先将标志寄存器进 栈 再把当前 CS 的值进栈 最后将 IP 的值进栈 实验三实验三 汇编语言程序的调试与运行汇编语言程序的调试与运行 1 将下面的程序保存为 t1 asm 文件 生成可执行文件 t1 exe assume cs codesg codesg segment mov ax 2000h mov ss ax mov sp 0 add sp 4 pop ax pop bx push ax push bx pop ax pop bx mov ax 4c00h int 21h codesg ends end 2 用 Debug 跟踪 t1 exe 的执行过程 写出每一步执行后相关寄存器中的内容 3 PSP 的前两个字节是 CD 20 用 Debug 加载 t1 exe 查看 PSP 的内容 程序段前缀程序段前缀 PSPPSP 格式格式 偏移字节数说 明 000002 中断20H 000202 以节计算的内存大小 利用这个可看出是否感染引导型病毒 000401 保留 000505 至 DOS 的长调用 000A02 INT 22H 入口 IP 000C02 INT 22H 入口 CS 000E02 INT 23H 入口 IP 001002 INT 23H 入口 CS 001202 INT 24H 入口 IP 001402 INT 24H 入口 CS 001602 父进程的 PSP 段值 可测知是否被跟踪 001814 存放20个 SOFT 号 002C02 环境块段地址 从中可获知执行的程序名 002E04 存放用户栈地址指针 00321E 保留 005003 DOS 调用 INT 21H RETF 005302 保留 005507 扩展的 FCB 头 005C10 格式化的 FCB1 006C10 格式化的 FCB2 007C04 保留 008080 命令行参数长度 不包含总为最后的0D 及参数 也是程序运行期间缺省的 DTA 实验四实验四 bx bx 和和 looploop 指令的联合使用指令的联合使用 1 编程 向内存 0 200 0 23F 依次传送数据 0 63 assume cs code code segment mov ax 0020h mov ds ax mov bx 0 mov dl 0 mov cx 40h s mov bx dl inc bx inc dl loop s mov ax 4c00h int 21h code ends end 2 编程 向内存 0 200 0 23F 依次传送数据 0 63 程序中只能使用 9 条指令 包括程序 的 2 条返回语句 assume cs code code segment mov ax 0020h mov ds ax mov bl 0 mov cx 64 s mov bx bl inc bl loop s mov ax 4c00h int 21h code ends end 3 下面程序的功能是将 mov ax 4c00h 之前的指令复制到内存 0 200 处 补全程序 上机调试 跟踪运行结果 assume cs code code segment mov ax code 或者是 cs mov ds ax mov ax 0020h mov es ax mov bx 0 mov cx 18h s mov al bx mov es bx al inc bx loop s mov ax 4c00h int 21h code ends end 注意事项 1 因为要复制的数据是代码段的一部分指令 那么要复制的数据的段地址就和代码段的段 地址相同 2 因为要复制的数据是代码段的一部分指令 所以要复制的数据的长度 就是要复制的指 令的长度 可以先假设要复制 8 位 1h 0ffh 数据的字节数 如 10h 把程序补全 以便 通过编译 将程序补充完整并将其编译 连接 运行 接着进行 DEBUG 在 DEBUG 时我们 可以算出该程序的长度 然后得到正确的值后重新将程序补充完整 1 复制的是什么 从哪里到哪里 答 复制的是代码的二进制数据 从 CS 0 到 ES 0 2 复制的是什么 有多少个字节 你如何知道要复制的字节的数量 答 复制的是代码的二进制数据 有 CX 个字节 因为 CX 存放的是程序的长度 实验五实验五 编写 调试具有多个段的程序编写 调试具有多个段的程序 1 将下面的程序编译链接 用 Debug 加载 跟踪 然后回答问题 assume cs code ds data ss stack data segment dw 0123H 0456H 0789H 0abcH 0defH 0fedH 0cbaH 0987H data ends stack segment dw 0 0 0 0 0 0 0 0 stack ends code segment start mov ax stackstack mov ss ax mov sp 16 mov ax datadata mov ds ax push ds 0 push ds 2 pop ds 2 pop ds 0 mov ax 4c00h int 21h code ends end start CPU 执行程序 程序返回前 data 段中的数据均不变 CPU 执行程序 程序返回前 cs 2933 ss 2931 ds 2921 该程序加载后 code 段的段地址为 X 则 data 段的段地址为 X 2 stack 段 的段地址为 X 1 2 将下面的程序编译连接 用 Debug 加载 跟踪 然后回答问题 assume cs code ds data ss stack data segment dw 0123H 0456H data ends stack segment dw 0 0 stack ends code segment start mov ax stackstack mov ss ax mov sp 16 mov ax datadata mov ds ax push ds 0 push ds 2 pop ds 2 pop ds 0 mov ax 4c00h int 21h code ends end start CPU 执行程序 程序返回前 data 段中的数据均不变 CPU 执行程序 程序返回前 cs 2933 ss 2931 ds 2921 该程序加载后 code 段的段地址为 X 则 data 段的段地址为 X 2 stack 段的段 地址为 X 1 对于如下定义的段 name segment name ends 如果段中的数据占 N 个字节 则程序加载后 该段实际占有的空间为 N 15 16 16 解析 N 分为被16整除和不被16整除 当 N 被16整除时 占有的空间为 N 16 16 当 N 不被16整除时 占有的空间为 N 16 1 16 N 16得出的是可以整除的部分 还有一 个余数 余数肯定小于16 加上一个16 程序加载后分配空间是以16个字节为单位的 也就是说如果不足16个字节的也分配16个字 节 两种情况总结成一个通用的公式 N 15 16 16 3 将下面的程序编译连接 用 Debug 加载 跟踪 然后回答问题 assume cs code ds data ss stack code segment start mov ax stackstack mov ss ax mov sp 16 mov ax datadata mov ds ax push ds 0 push ds 2 pop ds 2 pop ds 0 mov ax 4c00h int 21h code ends data segment dw 0123H 0456H data ends stack segment dw 0 0 stack ends end start CPU 执行程序 程序返回前 data 段中的数据均不变 CPU 执行程序 程序返回前 cs 2931 ss 2934 ds 2935 设程序加载后 code 段的段地址为 X 则 data 段的段地址为 X 3 stack 段 的段地址为 X 4 4 若将 1 2 3 题中的最后一条伪指令 end start 改为 end 则那个程序仍然可以正确 执行 请说明原因 答 这三条程序仍然可以正确执行 只是不知道入口位置 如果不指明入口位置 则程序从 所分配的空间开始执行 前 2 个是数据段 只有从第 3 条开始是指令代码 5 程序如下 编写 code 段中的代码 将 a 段和 b 段中的数据依次相加 将结果存到 c 段中 assume cs code a segment db 1 2 3 4 5 6 7 8 a ends b segment db 1 2 3 4 5 6 7 8 b ends c segment db 0 0 0 0 0 0 0 0 c ends code segment start mov ax a mov ds ax mov ax b mov es b mov bx 0 mov cx 8 s mov al bx add es bx al inc bx loop s mov ax c mov ds ax mov bx 0 mov cx 8 s0 mov al es bx mov bx al inc bx loop s0 mov ax 4c00h int 21h code ends end start 一次循环版 mov ax a mov ds ax ds 指向 a 段地址 mov ax b mov es ax es 指向 b 段地址 mov bx 0 mov cx 8 s mov al bx add al es bx mov dx c mov ds dx ds 指向 c 段地址 mov bx al mov ax a mov ds ax 重新将 ds 指向 a 段 inc bx loop s 一次循环版 改进版 利用堆栈 mov ax a mov ds ax mov ax b mov es ax mov ax c mov ss ax mov bx 0 mov cx 8 s mov ax bx mov ss bx ax mov ax es bx add ss bx ax inc bx loop s 6 程序如下 编写 code 段中的代码 用 push 指令将 a 段中的 word 数据 逆序存储到 b 段 中 assume cs code a segment dw 1 2 3 4 5 6 7 8 a ends b segment dw 0 0 0 0 0 0 0 0 b ends code segment start mov ax a mov ds ax mov bx b mov ss bx mov sp 16 mov bx 0 mov cx 8 s push bx add bx 2 loop s mov ax 4c00h int 21h code ends end start 实验六实验六 不同寻址方式的灵活应用不同寻址方式的灵活应用 1 将课程上所有讲解过的程序上机调试 用 debug 跟踪其执行过程 并在过程中进一步理解 所讲内容 程序 7 1 assume cs code ds data data segment db unIX db foRK 共定义 8 个字节 但程序的运行位置仍在 16 字节之后 data ends code segment start mov al a mov bl b mov ax 4c00h int 21h code ends end start 程序 7 1 1 将第一个字符串转换为大写 将第二个字符串转换为小写 assume cs codesg ds datasg datasg segment db BaSiC db iNfOrMaTiOn datasg ends codesg segment start mov ax datasg mov ds ax 设置 ds 指向 datasg 段 mov bx 0 设置 bx 0 ds bx 指向 BaSiC 的第一个字母 mov cx 5 设置循环次数为 5 因为 BaSiC 有 5 个字母 s mov al bx 将 ASCII 码从 ds bx 所指向的单元中取出 and al 11011111B 将 al 中 ASCII 码的第五位置 0 变为大写字母 mov bx al 将转变后的 ASCII 码写回原单元 inc bx bx 加 1 ds bx 指向下一个字母 loop s mov bx 5 设置 bx 5 ds bx 指向 iNfOrMaTiOn 的第一个字母 mov cx 11 设置循环次数 11 因为 iNfOrMaTiOn 有 11 个字母 s0 mov al bx or al 00100000B 将 al 中的 ASCII 码的第五位置为 1 变为小写字母 mov bx al inc bx loop s0 mov ax 4c00h int 21h codesg ends end start 问题 7 6 编程 将 datasg 段中的每个单词的头一个字母改为大写字母 assume cs codesg ds datasg datasg segment db 1 file db 2 edit db 3 search db 4 view db 5 options db 6 help datasg ends codesg segment start mov ax datasg mov ds ax mov bx 0 mov cx 6 s mov al bx 3 and al 11011111B mov bx 3 al add bx 16 loop s mov ax 4c00h int 21h codesg ends end start 问题 7 8 编程 将 datasg 段中的每个单词改为大写字母 申请内存空间 assume cs codesg ds datasg datasg segment db ibm db dec db dos db vax dw 0 定义一个字 用来暂存 cx datasg ends codesg segment start mov ax datasg mov ds ax mov bx 0 mov cx 4 s0 mov ds 40H cx 将外层循环的 cx 值保存在 datasg 40H 单元中 mov si 0 mov cx 3 s mov al bx si and al 11011111B mov bx si al inc si loop s add bx 16 mov cx ds 40H loop s0 mov ax 4c00h int 21h codesg ends end start 利用堆栈 assume cs codesg ds datasg ss stacksg datasg segment db ibm db dec db dos db vax datasg ends stacksg segment dw 0 0 0 0 0 0 0 0 定义一个段 用来做栈段 容量为 16 个字节 codesg segment start mov ss ax mov sp 16 mov ax datasg mov ds ax mov bx 0 mov cx 4 s0 push cx 将外层循环的 cx 值压栈 mov si 0 mov cx 3 cx 设置为内层循环的次数 s mov al bx si and al 11011111B mov bx si al inc si loop s add bx 16 pop cx 从栈顶弹出原 cx 的值 恢复 cx loop s0 外层循环的 loop 指令将 cx 中的计数值减去 1 mov ax 4c00h int 21h codesg ends end start 2 编程 完成问题 7 9 中的程序 编程 将 datasg 段中每个单词的前4个字母改为大写字母 assume cs codesg ds datasg ss stacksg datasg segment db 1 display db 2 brows db 3 replace db 4 modify datasg ends stacksg segment dw 0 0 0 0 0 0 0 0 stacksg ends codesg segment start mov ax datasg mov ds ax mov bx 0 mov ax stacksg mov ss ax mov sp 16 mov cx 4 s0 push cx mov si 3 mov cx 4 s mov al bx si and al 11011111b mov bx si al inc si loop s add bx 16 pop cx loop s0 mov ax 4c00h int 21h codesg ends end start 实验七实验七 寻址方式在结构化数据访问中的应用寻址方式在结构化数据访问中的应用 实验内容实验内容 下面的程序中已经定义好了这些数据 assume cs codesg data segment db 1975 1976 1977 1978 1980 1980 1981 1982 1983 db 1984 1985 1986 1987 1988 1989 1990 1991 1992 db 1993 1994 1995 以上是表示 21 年的 21 个字符串 dd 16 22 382 1356 2390 8000 16000 24486 50065 97479 140417 197514 dd 345980 590827 803530 1183000 1843000 2759000 3753000 4649000 5937000 以上是表示 21 年公司总收入的 21 个 dword 型数据 dw 3 7 9 13 28 38 130 220 476 778 1001 1442 2258 2793 4037 5635 8226 dw 11542 14430 15257 17800 以上是表示 21 年公司雇员人数的 21 个 word 型数据 data ends table segment db 21 dup year summ ne table ends codesg segment start codesg ends end start 编程 将 data 段中的数据按如下格式写入到 table 段中 并计算 21 年中的人均收入 取整 结果也按照下表所示的格式保存在 table 段中 程序一 四个循环 assume cs codesg ds data es table data 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 84个字节 dd 16 22 382 1356 2390 8000 16000 24486 50065 97479 140417 197514 dd 345980 590827 803530 1183000 1843000 2759000 3753000 4649000 5937000 dw 3 7 9 13 28 38 130 220 476 778 1001 1442 2258 2793 4037 5635 8226 dw 11452 14430 15257 17800 data ends table segment db 21 dup year summ ne table ends codesg segment start mov ax data mov ds ax mov ax table mov ss ax mov bx 0 mov si 0 mov bp 0 bp 段地址默认在 ss 中 mov cx 21 s0 mov ax bx si 切记 并不存在 mov 段寄存器 段寄存器 这样的指令形式 故此处读 mov bp 0 ax 入数据时 必须执行先将数据存放到寄存器 ax 中 然后再放到制定寄 add si 2 存器 并且 add si 2两次 依次类推按照不同偏移地址写入数据 mov ax bx si mov bp 2 ax add si 2 add bp 10h loop s0 mov cx 21 mov bp 0 mov si 0 s1 mov ax bx si 84 mov bp 5 ax add si 2 mov ax bx si 84 mov bp 7 ax add si 2 add bp 10h loop s1 mov cx 21 mov bp 0 mov si 0 s2 mov ax bx si 168 mov bp 10 ax add si 2 add bp 10h loop s2 mov cx 21 mov bp 0 s3 mov ax bp 5 mov dx bp 7 div word ptr bp 10 mov bp 13 ax 把寄存器 ax 中所得的商存放在 table 指定位置 add bp 10h loop s3 mov ax 4c00h int 21h codesg ends end start 程序二 一个循环 assume cs code ds data es table data 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 2759000 3753000 4649000 5937000 dw 3 7 9 13 28 38 130 220 476 778 1001 1442 2258 2793 4037 5635 8226 dw 11452 14430 15257 17800 data ends table segment db 21 dup year summ ne table 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 s mov ax bx mov es si ax mov ax bx 2 mov es si 2 ax 把 db 的数据写入指定位置 mov ax bx 84 mov es si 5 ax mov dx bx 86 mov es si 7 dx 把 dd 的数据写入指定位置 div word ptr ds di 168 mov es si 13 ax 把 dw 的数据作为除数 直接运算 并将寄存器 ax 的值送 mov ax di 168 入指定位置 mov es si 10 ax 把 dw 的数据写入指定位置 add di 2 每回合改变的偏移地址 add bx 4 add si 16 loop s mov ax 4c00h int 21h code ends end start 实验八实验八 转移指令的原理转移指令的原理 1 分析下面的程序 在运行前思考 这个程序可以正确返回吗 运行后再思考 为什么是这种结果 assume cs codesg codesg segment mov ax 4c00h int 21h start mov ax 0 将 ax 置 0 s nop 占一字节 机器码 90 nop 占一字节 机器码 90 mov di offset s di s 的偏移地址 mov si offset s2 si s2 偏移地址 mov ax cs si ax jmp short s1 指令对应的机器码 EBF6 mov cs di ax jmp short s1 覆盖 s 处两条 nop 指令 s0 jmp short s 转移到已经被修改过的 s 处 执行 jmp short s1 由此 可 s1 mov ax 0 分析得已经返回至 mov ax 4c00h 处 int 21h mov ax 0 s2 jmp short s1 nop codesg ends end start 当指令执行到 s0 jmp short s 时 该指令得到执行 编译器算出的 ip 位移量为 16 补码 F0 ip ip 位移量 18H 16 8 cs 8指向 s 当指令执行到 s 标段 jmp 命令时 第1个字节中的机器码为 EBF6 编译器算出的 ip 位移量 为 10 补码 F6 ip ip 位移量 AH 10 0 cs 0指向第一条指令 实验实验 9 9 根据材料编程根据材料编程 根据相关材料编程 材料详见书上 188 页 编程 在屏幕中间分别显示绿色 绿底红色 白底蓝色的字符串 welcome to masm assume cs code ds data data segment db welcome to masm data ends code segment start mov ax data mov ds ax mov ax 0b800h mov es ax mov bx 0 mov si 0 mov cx 16 s0 mov ax bx mov es bx si 720h ax mov es bx si 721h 02h inc bx inc si loop s0 mov bx 0 mov cx 16 mov si 160 s1 mov ax bx mov es bx si 720h ax mov es bx si 721h 24h inc bx inc si loop s1 mov bx 0 mov cx 16 mov si 320 s2 mov ax bx mov es bx si 720h ax mov es bx si 721h 71h inc bx inc si loop s2 mov ax 4c00h int 21h code ends end start 实验实验 1010 编写子程序编写子程序 1 显示字符串 编写一个通用的子程序来实现显示字符串的功能 子程序描述 名称 show str 功能 在指定的位置用指定的颜色 显示一个用 0 结束的字符串 参数 dh 行号 取值范围 0 24 dl 列号 取值范围 0 79 cl 颜色 ds si 指向字符串的首地址 返回 无 如 在屏幕的 8 行 3 列 用绿色显示 data 段中的字符串 assume cs code data segment db Welcome to masm 0 data ends code segment start mov dh 8 mov dl 3 mov cl 2 mov ax data mov ds ax mov si 0 call show str mov ax 4c00h int 21h show str mov ax 160 mul dh mov bx ax mov ax 2 mul dl add bx ax mov ax 0B800H mov es ax mov dl cl mov cl 0 show0 mov ch ds si jcxz ok mov byte ptr es bx ch mov byte ptr es bx 1 dl add bx 2 inc si jmp show0 ok ret code ends end start 2 解决除法溢出问题 编写子程序避免除法溢出问题 子程序描述 名称 divdw 功能 进行不会产生溢出的除法运算 被除数为 dword 型 除数为 word 型 结果为 dword 型 参数 ax dword 型数据的低 16 位 dx dword 型数据的高 16 位 cx 除数 返回 dx 结果的高 16 位 ax 结果的低 16 位 cx 余数 应用举例 计算 1000000 10 F4240H 0AH 结果 dx 0001H ax 86A0H cx 0 assume cs code code segment start mov ax 4240h mov dx 000fh mov cx 0ah call divdw mov ax 4c00h int 21h 名称 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 高位在 ax 余数在 dx mov si ax pop ax div cx 被除数高位的商 低位 cx 高位在 ax 余数在 dx mov cx dx 余数入 cx mov dx si 高位的商入 dx pop bx pop si ret code ends end start 公式 x n int h n 65536 rem h n 65536 l n 解析 把一个会溢出的除法 变成几个除法来做 如果高位除法有商 那么商就是结果的高位值 如果会有余数 那么余数自然不能丢弃 余数就作为低位除法的 dx 也就是高位的被除数 因为他是从高位除法中余下的 做低位除法的时候 就拿余下的 dx 低位数的 ax 除以除数 会得到 一个低位的商 和 余 数 高位的商 低位数的商 余数 就是结果 关键点关键点 不能按照那个公式进行运算不能按照那个公式进行运算 应该在充分理解的基础上写出算法应该在充分理解的基础上写出算法 3 数值显示 将二进制数据用十进制显示到屏幕 子程序描述 名称 dtoc 功能 将 word 型数据转变为表示十进制的字符串 字符串以 0 结尾 参数 ax word 型数据 ds si 指向字符串的首地址 返回 无 应用举例 编程将数据 12666 以十进制的形式在屏幕的 8 行 3 列 用绿色显示出来 assume cs code data segment db 10 dup 0 data ends code segment start mov ax 12666 把被除数看作是 32 位 mov bx data mov ds bx mov si 0 call dtoc mov dh 8 mov dl 3 mov cl 2 call show str mov ax 4c00h int 21h dtoc mov bx 10 设置除数为 10 mov dx 0 设置被除数的高位为 0 mov cx ax 将除法运算后的商存入 cx jcxz 跳转据此实现 div bx jcxz dtoc1 inc di 记录字符个数 add dx 30h 将余数转化为字符 push dx 将 dx 入栈 保证输出的结果是正确的 jmp dtoc dtoc1 mov cx di 将字符数目存入 cx 依次决定写入的循环次数 dtoc2 pop dx 将 dx 出栈 最先出栈的是最后存入的字符 mov ds si dx 将 dx 写入数据区域 inc si 指向下一个单元 loop dtoc2 mov si 0 设置字符串的结尾符 0 ret show str mov ax 160 mul dh mov bx ax mov ax 2 mul dl add bx ax mov ax 0B800H mov es ax mov dl cl mov cl 0 mov si 0 show0 mov ch ds si jcxz end1 mov byte ptr es bx ch mov byte ptr es bx 1 dl add bx 2 inc si jmp show0 end1 ret code ends end start 实验实验 1111 编写子程序编写子程序 编写一个子程序 将包含任意字符 以 0 结尾的字符串中的小写字母转换成大写字母 子程序描述如下 名称 letterc 功能 将以以 0 结尾的字符串中的小写字母转换成大写字母 参数 ds si 指向字符串首地址 assume cs codesg datasg segment db Beginner s All purpose Symbolic Instruction Code 0 datasg ends codesg segment begin mov ax datasg mov ds ax mov si 0 call letterc mov ax 4c00h int 21h letterc mov ch 0 将寄存器 cx 的高位置为 0 mov cl ds si 将 ds 段中的字符存入 cl cmp cl 97 jb s0 cmp cl 122 ja s0 判断读入的字符的 ASCII 码是否在 97 122 之间 如果是即为 and cl 11011111b 小写字母 mov ds si cl 将二进制位的第五位置为 0 使得小写字母变大写字母 s0 inc si 将 si 自增 指向下一个字符 jcxz end1 通过判断读入的字符是否为 0 来确定是否结束循环 jmp letterc end1 ret codesg ends end begin 实验实验 1212 编写 应用中断例程编写 应用中断例程 编写 0 号中断的处理程序 使得在除法溢出发生时 在屏幕中间显示字符串 divide error 然后返回到 DOS assume cs code code segment start mov ax cs mov ds ax mov si offset do0 设置 ds si 指向源地址 mov ax 0 mov es ax 使用中断向量表中不使用的内存单元 mov di 200h 设置 es di 指向目的地址 mov cx offset do0end offset do0 设置 cx 为传输长度 cld 设置传输方向为正 rep movsb 此处的指令类似于 mov es di word ptr ds si loop s 事实上并不存在这种指令 mov ax 0 mov es ax mov word ptr es 0 4 200h mov word ptr es 0 4 2 0 设置中断向量表 除法溢出为 0 号中断 mov ax 1000h mov bl 1 div bl 此处为实验除法溢出的代码 mov ax 4c00h int 21h do0 jmp short do0start 指令占两个字节 故字符串的偏移地址为 202h db divide error do0start mov ax cs mov ds ax mov si 202h 设置 ds si 指向字符串 mov ax 0b800h mov es ax mov di 12 160 36 2 设置 es di 指向显存空间的中间位置 mov cx 13 设置 cx 为字符长度 s mov al si mov es di al inc si add di 2 loop s mov ax 4c00h int 21h do0end nop code ends end start 实验实验 1313 编写 应用中断例程编写 应用中断例程 1 编写并安装 int 7ch 中断例程 功能为显示一个用 0 结束的字符串 中断例程安装在 0 200 处 参数 dh 行号 dl 列号 cl 颜色 ds si 指向字符串首地址 以上中断例程安装成功后 对下面的程序进行单步跟踪 尤其要注意观察 int iret 指令执 行前后 CS IP 和栈中的状态 名称 int 7ch 中断例程 功能 显示一个0结束的字符串 中断例程安装在0 200处 参数 dh 行号 dl 列号 cl 颜色 ds si 指向字符串首地址 assume cs code data segment db welcome to masm 0 data ends 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 dh 10 mov dl 10 mov cl 2 mov ax data mov ds ax mov si 0 int 7ch 此处为实验代码 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 2 编写并安装 int 7ch 中断例程 功能为完成 loop 指令的功能 参数 cx 循环次数 bx 位移 以上中断例程安装成功后 对下面的程序进行单步跟踪 尤其要注意观察 int iret 指令执 行前后 CS IP 和栈中的状态 在屏幕中间显示 80 个 名称 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 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 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 3 下面的程序 分别在屏幕的第 2 4 6 8 行显示四句英文诗 补全程序 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 中放列号 m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国民航大学《房屋建筑学双语》2023-2024学年第二学期期末试卷
- 四川应用技术职业学院《临床免疫学及检验》2023-2024学年第一学期期末试卷
- 江西省高安市第四中学2024-2025学年初三2月化学试题模拟试题含解析
- 漯河职业技术学院《综合商务英语(1)》2023-2024学年第二学期期末试卷
- 郑州澍青医学高等专科学校《医疗与生育保障》2023-2024学年第二学期期末试卷
- 山西农业大学附属学校2025届初三3月线上考试化学试题含解析
- 浙江传媒学院《控制论基础》2023-2024学年第二学期期末试卷
- 云南省勐海县第三中学2025年高中毕业生班阶段性测试(三)英语试题含解析
- 铜仁幼儿师范高等专科学校《经典创业案例分析》2023-2024学年第二学期期末试卷
- 浙江东方职业技术学院《预防医学创新实验》2023-2024学年第二学期期末试卷
- 医院灾害脆弱性分析报告(2020版)
- 预制构件安装施工检验批质量验收记录表
- 钢木质隔热防火门成品检验报告
- SB/T 10104-2017糖果充气糖果
- GB/Z 18462-2001激光加工机械金属切割的性能规范与标准检查程序
- GB/T 4457.4-2002机械制图图样画法图线
- GB/T 2421.1-2008电工电子产品环境试验概述和指南
- 国外发票模板invoice
- 企业重组相关税收政策培训课件
- 人力资源部部长岗位廉洁风险点排查
- PPT公路工程施工常见质量通病与防治措施(图文并茂)
评论
0/150
提交评论