您的位置:首页 > 其它

《汇编语言(第3版)》王爽 第十六章实验

2016-12-27 20:30 190 查看
本次实验遇到一个问题,就是缺少一条伪指令org XX后,程序跑飞

网上看了一下,总结一下就是使用org XX这个伪指令后就是告诉编译器接下来的偏移地址是XX,而不是从0开始。

;编写包含多个子程序的中断例程
;功能包括:清屏,设置前景色,设置背景色,向上滚动一行
;思路:前三个问题不大,第四个的思路是从第二行开始,把每一行的字符复制到上一行
;可利用movsb指令
assume cs:code,ss:stack
stack segment
db 32 dup (0)
stack ends

code segment
start:	;中断安装程序,安装在0:204处,200h处保存原先中断地址
mov ax,stack
mov ss,ax
mov sp,32

push cs
pop ds

mov ax,0
mov es,ax

mov si,offset int7ch
mov di,204h
mov cx,offset int7chend - offset int7ch
cld
rep movsb

push es:[7ch*4]
pop es:[200h]
push es:[7ch*4+2]
pop es:[202h]

cli
mov word ptr es:[7ch*4],204h
mov word ptr es:[7ch*4+2],0
sti

mov ax,4c00h
int 21h

org 204h	;这是伪指令,作用是告诉编译器下面的程序偏移地址从204h开始。

int7ch:  jmp short set

table  dw sub1,sub2,sub3,sub4	;该表用来保存子程序的地址

set:  push bx

cmp ah,3
ja sret
mov bl,ah
mov bh,0
add bx,bx

call word ptr table[bx]

sret:  pop bx

iret

sub1:	;该子程序功能:清屏
push bx
push es
push cx

mov bx,0b800h
mov es,bx
mov bx,0
mov cx,2000
sub1s:  mov byte ptr es:[bx],' '
add bx,2
loop sub1s

pop cx
pop es
pop bx
ret

sub2:	;该子程序功能设置:前景色
push bx
push es
push cx

mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
sub2s:  add byte ptr es:[bx],11111000b
or es:[bx],al
add bx,2
loop sub2s

pop cx
pop es
pop bx
ret

sub3:	;改变背景色子程序
push cx
push bx
push es
mov cl,4			;背景色在567位,所以al要先移位
shl al,cl
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
sub3s:  add byte ptr es:[bx],10001111b
or es:[bx],al
add bx,2
loop sub3s
pop es
pop bx
pop cx
ret

sub4:	;向上滚动一行。
push bx
push es
push si
push di
push cx

mov bx,0b800h
mov es,bx
mov ds,bx
mov si,160
mov di,0
mov cx,24
cld
sub4s:  push cx
mov cx,160
rep movsb		;注意movsb指令中cx=160就是整行字符总数
pop cx			;因此不用二重循环,单循环24次即可
loop sub4s		;此外在因为160个字节复制完成后,si,di已经自加
;所以在此循环中我们不用再加增量,每次循环在上
;次基础上再加
mov cx,80
mov si,0		;因为整体上移一行后,最后一行为空,
sub4s1:  mov byte ptr es:[160*24+si],' '	;所以25行为空
add si,2
loop sub4s1
pop cx
pop di
pop si
pop es
pop bx
ret

int7chend:  nop

code ends
end start


;调试程序,测试新的7ch中断例程
assume cs:code,ss:stack

stack segment
db 128 dup (0)
stack ends

code segment
start:
mov ax,stack
mov ss,ax
mov sp,128

mov ah,1	;测试前景色
mov al,4
int 7ch
call delay
mov ah,2	;测试背景色
mov al,2
int 7ch
call delay
mov ah,3	;测试滚动一行
mov al,2
int 7ch
call delay
mov ah,0	;测试清屏,注意7ch程序仅仅去除字符,背景色不变
mov al,0
int 7ch
call delay

mov ax,4c00h
int 21h

delay:	push dx		;延时函数,总共循环100000h次
push ax

mov dx,10h
mov ax,0
s:	sub ax,1
sbb dx,0
cmp ax,0
jne s
cmp dx,0
jne s

pop ax
pop dx

ret
code ends
end start
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: