前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >王爽汇编语言实验16

王爽汇编语言实验16

作者头像
yifei_
发布2022-11-14 14:08:25
3180
发布2022-11-14 14:08:25
举报
文章被收录于专栏:yifei的专栏

先放代码… sy16.asm

代码语言:javascript
复制
assume cs:code

code segment
start:
	mov ax,cs
	mov ds,ax ;设置ds
	mov si,offset int7c ;ds:si源地址
	
	mov ax,0
	mov es,ax
	mov di,200h ;es:di目的地址
	mov cx,offset int7cend-offset int7c ;cx为传输长度
	cld ;传输方向为正
	rep movsb ;开始传输
	
	cli
	mov ax,0
	mov es,ax
	mov word ptr es:[7ch*4],200h
	mov word ptr es:[7ch*4+2],0 ;设置新的int7c中断例程地址
	sti
	
	mov ax,4c00h
	int 21h
	
	org 200h ; ←←←←←←←←←重点
int7c:
	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 cx
		push es
		mov bx,0b800h
		mov es,bx
		mov bx,0
		mov cx,2000
	sub1s:
		mov byte ptr es:[bx],' '
		add bx,2
		loop sub1s
		pop es
		pop cx
		pop bx
		ret
		
	sub2:
		push bx
		push cx
		push es
		mov bx,0b800h
		mov es,bx
		mov bx,1
		mov cx,2000
	sub2s:
		and byte ptr es:[bx],11111000b
		or es:[bx],al
		add bx,2
		loop sub2s
		
		pop es
		pop cx
		pop bx
		ret
		
	sub3:
		push bx
		push cx
		push es
		mov cl,4
		shl al,cl
		mov bx,0b800h
		mov es,bx
		mov bx,1
		mov cx,2000
	sub3s:
		and byte ptr es:[bx],10001111b
		or es:[bx],al
		add bx,2
		loop sub3s
		pop es
		pop cx
		pop bx
		ret
		
	sub4:
		push cx
		push si
		push di
		push es
		push ds
		
		mov si,0b800h
		mov es,si
		mov ds,si
		mov si,160
		mov di,0
		cld
		mov cx,24
	sub4s:
		push cx
		mov cx,160
		rep movsb
		pop cx
		loop sub4s
		
		mov cx,80
		mov si,0
	sub4s1:
		mov byte ptr [160*24+si],' '
		add si,2
		loop sub4s1
		pop ds
		pop es
		pop di
		pop si
		pop cx
		ret

int7cend:nop
code ends
end start

tstsy16.asm

代码语言:javascript
复制
assume cs:code

code segment
start:
	;set front color
	mov ah,1
	mov al,3
	int 7ch
	call delay

	;set background color
	mov ah,2
	mov al,7
	int 7ch
	call delay

	mov ah,3
	int 7ch
	call delay
	
	;clean screen
	mov ah,0
	int 7ch
	
	mov ax,4c00h
	int 21h
	
delay:
	push ax
	push dx
	mov dx,0h
	mov ax,0ffffh
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

代码写完之后发现结果不对,调试一下发现问题出在int7c的中断例程中 call word ptr table[bx] 这一句。 程序首先进行编译,这时候table实际上就被替换为了一个地址,然后再执行程序的时候,这个错误的地址和程序一块被拷贝到了0:200开始的内存中,所以执行程序的时候会出问题。 要解决这个问题需要在要拷贝的程序前添加一句 org 200h,告诉编译器,在编译的时候就把后面这段程序当做存在0:200处,这样一些标号的地址就是我们想要的正确地址。

欢迎与我分享你的看法。 转载请注明出处:http://taowusheng.cn/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档