实验九

练习一:

代码:

; 在屏幕上输出内存单元中的十进制两位数
assume cs:code, ds:data
data segment
db 12
db 0,0 ; 前一个字节用于保存商,后一个字节用于保存余数
data ends
code segment
start:
mov ax,data ; 使得ds <-- data段地址
mov ds,ax

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,30h ; 使得dl中的数值转换为数字字符
int 21h

mov ah,2
mov dl,ds:[2] ; 使得dl <-- data段中保存余数的字节单元数值
add dl,30h ; 使得dl中的数值转换为数字字符
int 21h

mov ax,4c00h
int 21h
code ends
end start

实验结果:

将数值转换为数字字符是将原本数值加十六进制30.

练习二:

;补全程序,参考t1.asm,综合应用以下知识完成:

; (1) loop指令、内存单元地址的灵活表示
; (2) div指令, 数字→数字字符的转换
; (3) int 21h的2号子功能,完成单个字符输出的方法,即: 
; mov ah,2
; mov dl,待输出字符或其ASCⅡ码
; int 21h
; (4) 数据和数据之间以空格间隔的实现: 使用(3)输出空格字符

代码:

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 bx,0
mov cx,5

s: mov ah,0
mov al,ds:[bx]
mov dl,10
div dl

mov dl,al
mov dh,ah

mov ah,2
add dl,30h
int 21h

mov ah,2
mov dl,dh
add dl,30h
int 21h

mov ah,2
mov dl,0
int 21h

inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start

实验结果:

该实验主要用除以十,和求余十操作实现,多次循环来输出数字。

练习三:

代码:

assume cs:code,ds:data
data segment
db 'welcome to masm!'
data ends
code segment
start: mov ax,data
mov ds,ax
mov cl,10h
mov ch,0
mov ax,0B800h
mov es,ax
mov si,0h
mov di,0h

s: mov al,0
mov al,ds:[si]
mov ah,0
mov ah,00000010B
mov es:[720h+di],ax
mov ah,11110001B
mov es:[720h+di+160D],ax
mov ah,10100100B
mov es:[720h+di+320D],ax
inc si
add di,02h
loop s
mov ax,4c00h
int 21h

code ends
end start

该练习是在显存缓冲区进行读写,将字符和属性值正确写入缓冲区,就可以显示字符。

80*25彩色字符模式显示缓冲区早内存地址空间中为B8000H-BFFFFH共32KB的空间。

该实验让我对输出带有颜色的字符有初步了解。

 

posted @ 2018-12-10 22:53  1042004503  阅读(109)  评论(0编辑  收藏  举报