汇编实验9 根据材料编程
Posted dreamlocker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编实验9 根据材料编程相关的知识,希望对你有一定的参考价值。
实验内容
(1)补全代码如下:
1 ; 在屏幕上输出内存单元中的十进制两位数 2 assume cs:code, ds:data 3 data segment 4 db 12 5 db 0, 0 ; 前一个字节用于保存商,后一个字节用于保存余数 6 data ends 7 code segment 8 start: 9 mov ax, data 10 mov ds, ax ; 补全指令,使得ds <-- data段地址 11 12 mov ah, 0 13 mov al, ds:[0] ; ax <-- data段字节单元的被除数12 14 mov bl, 10 15 div bl 16 mov ds:[1], al ; 补全代码,让商保存到data段注释中指定的单元 17 mov ds:[2], ah ; 补全代码,让余数保存到data段注释中指定的单元 18 19 mov ah, 2 20 mov dl, ds:[1] ; 补全代码,使得dl <-- data段中保存的商的字节单元数值 21 add dl, 48 ; 补全代码,使得dl中的数值转换为数字字符 22 int 21h 23 24 mov ah, 2 25 mov dl, ds:[2] ; 补全代码,使得dl <-- data段中保存余数的字节单元数值 26 add dl, 48 ; 补全代码,使得dl中的数值转换为数字字符 27 int 21h 28 29 mov ax,4c00h 30 int 21h 31 code ends 32 end start
进行汇编连接,执行可得:
较为基础,就不做赘述了。
(2)补全代码如下:
1 assume cs:code, ds:data 2 data segment 3 db 12, 35, 96, 55, 67 4 data ends 5 code segment 6 start: 7 ; 补全程序,参考t1.asm,综合应用以下知识完成: 8 ; (1) loop指令、内存单元地址的灵活表示 9 ; (2) div指令, 数字→数字字符的转换 10 ; (3) int 21h的2号子功能,完成单个字符输出的方法,即: 11 ; mov ah,2 12 ; mov dl,待输出字符或其ASCⅡ码 13 ; int 21h 14 ; (4) 数据和数据之间以空格间隔的实现: 使用(3)输出空格字符 15 mov ax, data 16 mov ds, ax 17 mov si, 0 18 19 mov cx, 5 20 s: mov ah, 0 21 mov al, ds:[0 + si] 22 mov bl, 10 23 div bl 24 mov ds:[5 + si], al ;将商保存到待用内存单元 25 mov ds:[6 + si], ah ;将余数保存到待用内存单元 26 27 mov ah, 2 28 mov dl, ds:[5 + si] 29 add dl, 48 30 int 21h 31 32 mov ah, 2 33 mov dl, ds:[6 + si] 34 add dl, 48 35 int 21h 36 37 mov ah, 2 38 mov dl, ‘ ‘ ;输出空格 39 int 21h 40 inc si 41 loop s 42 43 mov ax,4c00h 44 int 21h 45 code ends 46 end start
经汇编连接后,执行可得:
此实验也比较基础,只是在(1)的基础上增加了loop循环及空格的输出,我在编写时也犯了几个小错,但完全是粗心之举,不足以记录
(3)
(个人认为实验3比较有趣)
源代码:
1 assume cs:code, ds:data, ss:stack 2 data segment 3 db ‘welcome to masm!‘ 4 db 02h, 24h, 71h ;字符串属性 5 data ends 6 7 stack segment 8 dw 8 dup (0) 9 stack ends ;预留栈空间,原本是打算利用多重循环实现,可是发现太复杂,便放弃 10 11 code segment 12 start: 13 mov ax, data 14 mov ds, ax ;字符串及属性值所在段的段地址送入ds 15 16 mov ax, stack 17 mov ss, ax 18 mov sp, 16h 19 20 mov ax, 0b800h 21 mov es, ax ;80×25彩色字符模式显示缓冲区段地址送入es 22 23 mov bx, 0728h 24 mov si, 0 25 mov di, 0 26 27 mov cx, 16 28 s1: mov al, ds:[di] 29 mov byte ptr es:[bx + si], al 30 mov al, ds:[16] 31 mov byte ptr es:[bx + si + 1], al 32 inc si 33 inc si 34 inc di 35 loop s1 36 37 mov si, 0 38 mov di, 0 39 mov cx, 16 40 s2: mov al, ds:[di] 41 mov byte ptr es:[bx + 00a0h + si], al 42 mov al, ds:[16 + 1] 43 mov byte ptr es:[bx + 00a0h + si + 1], al 44 inc si 45 inc si 46 inc di 47 loop s2 48 49 mov si, 0 50 mov di, 0 51 mov cx, 16 52 s3: mov al, ds:[di] 53 mov byte ptr es:[bx + 0140h + si], al 54 mov al, ds:[16 + 2] 55 mov byte ptr es:[bx + 0140h + si + 1], al 56 inc si 57 inc si 58 inc di 59 loop s3 60 ;s1, s2, s3三个循环分别按要求输出 61 mov ax, 4c00h 62 int 21h 63 code ends 64 end start
在集成环境中直接运行可得:
修改显存中的数据以达到直接输出的目的在之前已经接触过几次了,再加上实验文档中的引导练习,要达到的输出结果并非太难,只是代码还不够简练(想借用push 和 pop 来实现嵌套循环还是未能成功)。实验中有几个小问题如下:
1.mov指令时寄存器位数须一致,如29行中,应注意“byte ptr” 和 “al”,并且应注意能否直接送送值的问题
2.要求输出的屏幕中央,应事先计算80*25面积上居中的位置的地址(这步算了好久,有点惭愧,总感觉是偏的)
3.完全没有用到jmp指令。。。。。。。。。
总结与体会
实验3也算解了我一个在之前实验中留下的一些疑惑,也就是“显示缓冲区“”的相关内容,让我更加了解了如何控制屏幕的输出,挺有趣的
以上是关于汇编实验9 根据材料编程的主要内容,如果未能解决你的问题,请参考以下文章