首页
社区
课程
招聘
[求助]用主程序把子程序写入磁盘的问题
发表于: 2015-1-1 11:16 4012

[求助]用主程序把子程序写入磁盘的问题

2015-1-1 11:16
4012
assume cs:code 

stack segment
	dw 100 dup(0)
stack ends

code segment	
start:	
		mov ax, stack
		mov ss,ax
		mov sp,100
		
		mov ax,code
		mov es,ax
		mov bx,offset shanqu1
		
		mov al,1
		mov ch,0
		mov cl,1
		mov dl,0
		mov dh,0
		mov ah,3
		int 13h
		
		mov ax,code
		mov es,ax
		mov bx,offset shanqu2
		
		mov al,2
		mov ch,0
		mov cl,2
		mov dl,0
		mov dh,0
		mov ah,3
		int 13h

		
		mov ax,4c00h
		int 21h

shanqu1:
		mov ax,0
		mov es,ax
		mov bx,200h
		
		mov al,2
		mov ch,0
		mov cl,2
		mov dl,0
		mov dh,0
		mov ah,2
		int 13h
		
		mov ax,0
		mov ds,ax
		mov bx,200h
		jmp dword ptr [bx]
		
shanqu1end:nop

shanqu2:
	
	assume cs:code1
	
	data1 segment
		str1 db '1) reset pc',0
		str2 db '2) start system',0
		str3 db '3) clock',0
		str4 db '4) set clock',0
	data1 ends

	stack1 segment
		dw 100 dup(0)
	stack1 ends
	
	code1 segment

	start1:	
			mov ax, stack1
			mov ss,ax
			mov sp,100
			
			mov dh,10;显示的行号
			mov dl,15;显示的列号
			mov cl,4ah
			mov ax,data1
			mov ds,ax
			mov bx,offset str1
			call show_str;调用显示字符串函数
			mov dh,11;显示的行号
			mov dl,15;显示的列号
			mov cl,4ah
			mov ax,data1
			mov ds,ax
			mov bx,offset str2
			call show_str;调用显示字符串函数
			mov dh,12;显示的行号
			mov dl,15;显示的列号
			mov cl,4ah
			mov bx,offset str3
			call show_str;调用显示字符串函数
			mov dh,13;显示的行号
			mov dl,15;显示的列号
			mov cl,4ah
			mov bx,offset str4
			call show_str;调用显示字符串函数
	
		;显示字符串函数\/
			show_str: 
				push ax
				push bx
				push cx
				push dx
				push es
				push si
					push cx
				mov al,160
				dec dh
				mul dh
					push ax
				mov al,2
				dec dl
				mul dl
					pop si
				add si,ax
				mov ax,0b800h
				mov es,ax
					pop dx
				
				mov ch,0
				;pop si
				
			s:	mov cl,ds:[bx]
				jcxz ok
				mov al,ds:[bx]
				mov es:[si],al
				mov es:[si+1],dl
				inc bx
				add si,2
				jmp short  s
				
				ok: 
				pop si
				pop es
				pop dx
				pop cx
				pop bx
				pop ax
				ret	
	;显示字符串函数^
	
	code1 ends
	end start1

shanqu2end:nop

code ends		
end start

这个程序实现的功能是把两段程序:shanqu1;shanqu2分别写入软盘A的第1扇区和第2,3扇区,shanqu1程序负责把第2,3扇区的程序读到内存0:200处并执行,shanqu2程序打负责印字符串出来。
现在的问题是:编译报错:A1010,去掉shanqu2程序时可以正确编译;单独运行shanqu2程序时没问题,可以完整显示。

有朋友说:段定义是不可以嵌套的;遇到 end xxxx 语句后就结束源程序的处理了,后面的都不起作用;code 和 code1 要分成两个段定义。建议把code ends放在shanqu2:,assume cs:code1两条语句中间,这样确实可以正确编译了,但是这样写入磁盘的程序中就多了一条code ends语句,不知道这样会不会有影响,反正测试没有通过。把mov bx,offset shanqu2后面加了一条语句:add bx,2,目的是把除去code ends的程序写入磁盘,但是测试还是没有通过,不知道是哪里出了问题,请各位帮忙分析一下

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 3
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
还有个问题:我想再运行主程序的时候单纯实现复制的功能,不运行子程序。可是分成两个代码段后,子程序也运行了,请问如何不让子程序运行又可以实现复制的功能?
2015-1-1 11:21
0
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
3
以函数进行封装来划定执行界限?
2015-1-1 19:10
0
雪    币: 719
活跃值: (777)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
4
code ends不算是语句。他只是规定代码段结尾的宏指令而已。
你要的也就是把一段代码写出去而已。 所以直接从要写出的位置然后向下遇到标识的结束的标识符时结束就行了。然后就是读取到到内存最后控制eip到读入的开头字节就行了
2015-1-1 19:39
0
雪    币: 3
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
能否详细说明一下,谢谢
2015-1-1 20:15
0
雪    币: 3
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
您的意思是说不用分成两个段?把子程序直接写代码就可以了?是这个意思吗?那么应该怎样进行复制?
2015-1-1 20:20
0
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
7
start:
main proc
...
main endp

shanqu1proc
...
shanqu1 endp

shanqu2 proc
...
shanqu2 endp

end start
2015-1-1 21:17
0
游客
登录 | 注册 方可回帖
返回
//