第12章答案:
0070:018B
(2)
N*4
N*4+2
实验12 编写0号中断的处理程序(第240页)
-------------------------------------
完整程序如下:
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 ax,0
;mov es,ax
mov word ptr es:[0*4],200h ;设置中断向量的入口地址的偏移地址
mov word ptr es:[0*4+2],0 ;设置中断向量的入口地址的段地址
mov ax,0f000h
mov dx,22d
mov cx,10d
div cx ;此4句是为了做个溢出的除法
mov ax,4c00h
int 21h
do0: jmp short do0start
db "divide error!"
do0start:
mov ax,cs
mov ds,ax
mov si,202h ;设置ds:si指向字符串
mov ax,0B800h
mov es,ax
mov di,12*0A0h+2*32 ;设置es:di指向显存空间的中间位置
mov cx,13d ;设置字符串长度
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
第13章
mov ax,0
mov es,ax
mov di,200h
mov cx,offset lpend-offset lp
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,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
lp:push bp
mov bp,sp
add [bp+2],bx
pop bp
iret
lpend:nop
code ends
end start
检测点13.2 P(259)
(1)错,A000H-FFFFH之间的的程序是只读属性,可看第一章相关内容
(2)错,INT19是引导操作系统,DOS是在操作系统下运行的,故不可以
实验13 编写、应用中断例程
(1)编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。
参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址。P(262)
assume cs:code
data segment
db "welcome to masm!",0
data ends
code segment
start:mov ax,cs
mov ds,ax
mov si,offset ist
mov ax,0
mov es,ax
mov di,200h
mov cx,offset iend-offset ist
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],0200h
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
ist:push di
mov ax,0b800h
mov es,ax
mov al,160
mul dh
mov dh,0
add ax,dx ;设置di=160*dh+dl*2
add ax,dx
mov di,ax
s:cmp byte ptr [si],0
je ok
mov al,[si]
mov es:[di],al
mov es:[di+1],cl
inc si
add di,2
jmp short s
ok:pop di
iret
iend:nop
code ends
end start
(2)编写并安装int 7ch中断例程,功能为完成loop指令的功能。
参数:(cx)=循环次数,(bx)=位移
assume cs:code
code segment
start:mov ax,cs
mov ds,ax
mov si,offset istr
mov ax,0
mov es,ax
mov di,200h
mov cx,offset iend-offset istr
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],0200h
mov word ptr es:[7ch*4+2],0
mov ax,0b800h
mov es,ax
mov di,160*12
mov bx,offset s-offset se
mov cx,80
s:mov byte ptr es:[di],'!'
add di,2
int 7ch
se:nop
mov ax,4c00h
int 21h
istr:push bp
mov bp,sp
dec cx
jcxz ok
add [bp+2],bx
ok:pop bp
iret
iend:nop
code ends
end start
(3)下面的程序,分别在屏幕的第2、4、6、8行显示四句英文诗,补全程序。
[si]
bx
inc si
add di,2
第14章
检测点14.2(P169)
assume cs:code
code segment
start:mov bx,ax
mov cl,1
shl bx,cl
mov cl,3
shl ax,al
add ax,bx
mov ax,4c00h
int 21h
code ends
end start
实验14访问CMOS RAM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;艾米设计;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;0:second 2:minite 4:hour 7:day 8:moth 9:year;;;;;;;;;;
;;;;;;;;;;9,8,7,4,2,0为CMOS RAM中存放年月日,时分秒的单元;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;用的绿色显示;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
assume cs:code
data segment
db 9,8,7,4,2,0
data ends
code segment
start:mov ax,data
mov ds,ax
mov si,0
mov cx,6
mov bx,0b800h
mov es,bx
mov di,160*12+30*2
push di
s:push cx
mov al,[si]
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
mov byte ptr es:[di],ah
mov byte ptr es:[di+1],2 ;年月日读入显存
mov byte ptr es:[di+2],al
mov byte ptr es:[di+3],2
inc si
add di,6
pop cx
loop s
pop di
mov byte ptr es:[di+4],'/'
mov byte ptr es:[di+5],2
mov byte ptr es:[di+10],'/'
mov byte ptr es:[di+11],2
mov byte ptr es:[di+22],':'
mov byte ptr es:[di+23],2
mov byte ptr es:[di+28],':'
mov byte ptr es:[di+29],2
mov ax,4c00h
int 21h
code ends
end start
第15章
(2)在pop ds:[2]下加cli 在 mov ax,4c00h上加sti就OK了!
实验15 安装新的INT9中断例程
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment
start:mov ax,stack
mov ss,ax
mov sp,128 ;设置栈
push cs
pop ds ;把CS负给DS
mov si,offset new_int9
mov ax,0
mov es,ax
mov di,204h
mov cx,offset new_int9end-offset new_int9 ;安装NEW_INT9
cld
rep movsb
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h] ;保存旧的INT9地址
cli
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0h ;存放新的INT9向量表
sti
mov ax,4c00h
int 21h
new_int9:push ax
push bx
push cx
push es
in al,60h
pushf
call dword ptr cs:[200h] ;调用旧的INT9
cmp al,9eh ;A的断码为9EH
jne ok
mov ax,0b800h
mov es,ax
mov bx,0
mov cx,2000
s:mov byte ptr es:[bx],'A'
add bx,2
loop s
ok:pop es
pop cx
pop bx
pop ax
iret
new_int9end:nop
code ends
end start
第16章
检测点16.1P(289)
a[si]
word ptr cs:[8]
word ptr cs:[10]
2
检测点16.2P(291)
mov ax,data
mov ds,ax
实验16 P(299)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;实验16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;安装多个功能的中断例程;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;参数AH为功能号,0表示清屏,1表示设置前景颜色,2表示设置背景,3表示向上滚动一行;;;;;;;;;;;;;;;
;;;;;;;;;;;;;对于2,3号功能,用AL传送颜色,AL=0,1,2,3,4,5,6,7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;艾米设计;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
assume cs:code
data segment
db 'Hello masm!',0
db 'Hello asm32!',0
data ends
code segment
start:mov ax,cs
mov ds,ax
mov si,offset setscreen
mov ax,0
mov es,ax
mov di,0200h
mov cx,offset setscreen_end-offset setscreen
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],0
mov word ptr es:[7ch*4+2],20h ;安装完成,下面是测试代码,也可以是另外测试
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;先向屏幕写出两句话 Hello masm! 用与测试第3号功能 ;;;
; Hello asm32! ;;;
; ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
push di
push si
mov ax,0b800h
mov es,ax
mov di,160*3+30
mov ax,data
mov ds,ax
mov si,0
over1:mov al,[si]
cmp al,0
je over
mov es:[di],al
inc si
add di,2
jmp short over1
over:mov si,12
mov di,160*4+30
over3:mov al,[si]
cmp al,0
je over2
mov es:[di],al
inc si
add di,2
jmp short over3
over2:pop si
pop di
mov ah,3 ;测试3,也就是向上移动一行
int 7ch
call delay ;延时程序
mov ah,1 ;测试1,设置前景色
mov al,3
int 7ch
call delay
mov ah,0
int 7ch
mov ax,4c00h
int 21h
setscreen:jmp short set
table dw offset sub1-offset setscreen,offset sub2-offset setscreen,offset sub3-offset setscreen,offset sub4-offset setscreen
set:push bx
cmp ah,3
ja sret
mov bl,ah
mov bh,0
add bx,bx
call word ptr cs:2h[bx]
sret:pop bx
iret
sub1:push cx
push bx
push es
mov bx,0b800h
mov es,bx
mov cx,2000h
mov bx,0
sub1s:mov byte ptr es:[bx],' '
add bx,2
loop sub1s
pop es
pop bx
pop cx
ret
sub2:push cx
push bx
push es
mov bx,0b800h
mov es,bx
mov cx,2000h
mov bx,1
sub2s:and byte ptr es:[bx],11111000b
or es:[bx],al
add bx,2
loop sub2s
pop es
pop bx
pop cx
ret
sub3:push cx
push bx
push es
mov cl,4
shl al,cl
mov bx,0b800h
mov es,bx
mov cx,2000h
mov bx,1
sub3s:and byte ptr es:[bx],10001111b
or es:[bx],al
add bx,bx
loop sub3s
pop es
pop bx
pop cx
ret
sub4:push cx
push bx
push es
push ds
mov bx,0b800h
mov ds,bx
mov es,bx
mov si,160
mov di,0
cld
mov cx,24
sub4s:push cx
mov cx,160
rep movsb
pop cx
loop sub4s
mov cx,80h
mov si,0
sub4s1:mov byte ptr es:[160*24+si],' '
add si,2
loop sub4s1
pop ds
pop es
pop bx
pop cx
ret
setscreen_end:nop
;;;;;;;;;;;;;;;;;;延时程序,参数无;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
delay:push ax
push dx
mov dx,1000h
mov ax,0
s1:sub ax,1
sbb dx,0
cmp ax,0
jne s1
cmp dx,0
jne s1
pop dx
pop ax
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
code ends
end start
(完)