实验九
实验一:完成在屏幕上输出内存单元中的十进制两位数
; 在屏幕上输出内存单元中的十进制两位数 assume cs:code, ds:data data segment db 12 db ?,? ; 前一个字节用于保存商,后一个字节用于保存余数 data ends code segment start: mov ax,data mov ds,ax ; 补全指令,使得ds <-- data段地址 mov ah,0 mov al,ds:[0] ; ax <-- data段字节单元的被除数12 mov bl,10 div bl mov ds:[1],al ; 补全代码,让商保存到data段注释中指定的单元 mov ds:[2],ah ; 补全代码,让余数保存到data段注释中指定的单元 mov ah,2 mov dl,ds:[1] ; 补全代码,使得dl <-- data段中保存的商的字节单元数值 add dl,'0' ; 补全代码,使得dl中的数值转换为数字字符 int 21h mov ah,2 mov dl,ds:[2] ; 补全代码,使得dl <-- data段中保存余数的字节单元数值 add dl,'0' ; 补全代码,使得dl中的数值转换为数字字符 int 21h mov ax,4c00h int 21h code ends end start
如图所示,输出了12。
实验二:完成在屏幕上输出 data 段定义的 5 个十进制两位数,数据和数据 之间以空格间隔。
assume cs:code,ds:data data segment db 12,35,96,55,67 data ends code segment start: mov ax,data mov ds,ax mov bi,0 mov cx,5 s:mov ax,0 mov al,[bi] mov bl,10 div bl mov bx,ax mov dl,'0' add dl,bl mov ah,2 int 21h mov dl,'0' add dl,bh mov ah,2 int 21h mov ah,2 mov dl,32 int 21h inc bi loop s mov ax,4c00h int 21h code ends end start
实验截图如下:
实验三:教材实验 9(P187)
因为在80*25彩色字符显示下要求字符串显示在屏幕正中央,因此选择在11,12,13行显示。可算出第11行的偏移地址为0b800h。再根据资料上写的偶数地址存放字符,奇地址存放字符的颜色属性进行存放。思路是两个循环,一个循环进行每一行字符的输出,另一个循环使得输出三行。
assume ds:data, cs:code data segment db 'welcome to masm!' db 2H,24H,71H data ends code segment start: mov ax,data mov ds,ax mov ax,0b800H mov es,ax mov cx,3 mov si,0b800h mov di,16 s0:mov dx,cx mov bx,0 mov cx,16 s:mov al,[bx] mov ah,[di] mov es:[si],ax add si,2 ;后移输出位置 inc bx ;后移字符 loop s add si,80h ;换行 inc di mov cx,dx loop s0 mov ax,4c00h int 21h code ends end start
实验结果如下:
实验总结
在学习了基本的程序指令之后,可以自己写出一个比较完整的程序了。
通过做实验一以及实验二,使我更加细致了解了div指令。
通过做实验三,我发现熟练掌握灵活的定位内存地址,以及熟练掌握多重循环的运用会使得实验步骤大大简化。