⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dosdbg.c

📁 虚拟机设计与实现——C/C++
💻 C
字号:
#include<stdio.h>

/*global variables-------------------------------------------------*/

char INT1_STR[]="->SINGLED-STEP<-\n"; 
char INT3_STR[]="->BREAKPOINT<-\n"; 

unsigned short rCS,rSS,rDS;
short rAX,rBX,rCX,rDX;
unsigned short rIP;

unsigned char traceOn=0;
    
/*prototypes-------------------------------------------------------*/

void procCmd(int *lptr);

/*definitions------------------------------------------------------*/

void main()
{
	unsigned short oldInt1Seg;
	unsigned short oldInt1Offset;
	unsigned short oldInt3Seg;
	unsigned short oldInt3Offset;
	
	goto past_interrupts;
	   
	/* Handle INT 1 -----------------------------------------------*/ 
	
	int1:
	__asm
	{ 
		STI
		MOV rCS,CS
		MOV rSS,SS
		MOV rDS,DS
		MOV rAX,AX
		MOV rBX,BX
		MOV rCX,CX
		MOV rDX,DX
		
		POP CX
		MOV rIP,CX
		POP DX
		POP AX
		AND AX,65279
		PUSH AX
		PUSH DX
		PUSH CX	 
	}
	
	printf("%s",INT1_STR);
	printf("next instruction at IP=%u\n",rIP);  
	{
		int loop = 1;
	
		while(loop)
		{
			procCmd(&loop);	
		}
	}
	
	if(traceOn)
	{
		__asm
		{
			POP CX
			POP DX
			POP AX
			OR AX,256
			PUSH AX
			PUSH DX
			PUSH CX	 	
		}	
	}
	
	__asm
	{
		MOV AX,rAX
		MOV BX,rBX
		MOV CX,rCX
		MOV DX,rDX	
		IRET 
	}
	   
	/* Handle INT 3 -----------------------------------------------*/
	
	int3:
	__asm
	{ 
		STI
		MOV rCS,CS
		MOV rSS,SS
		MOV rDS,DS
		MOV rAX,AX
		MOV rBX,BX
		MOV rCX,CX
		MOV rDX,DX	
		
		POP CX
		POP DX
		POP AX
		AND AX,65279
		PUSH AX
		PUSH DX
		PUSH CX	  
	}
	
	printf("%s",INT3_STR);  
	{
		int loop = 1;
	
		while(loop)
		{
			procCmd(&loop);	
		}
	}
	
	if(traceOn)
	{
		__asm
		{
			POP CX
			POP DX
			POP AX
			OR AX,256
			PUSH AX
			PUSH DX
			PUSH CX	 	
		}	
	}
	
	__asm
	{
		MOV AX,rAX
		MOV BX,rBX
		MOV CX,rCX
		MOV DX,rDX	
		IRET 
	}
	
	/* Execution path begins here  --------------------------------*/
	
	past_interrupts:
	
	printf("Save old interrupts SEG:OFF\n"); 
    
	__asm
	{
		MOV AH,0x35
		MOV AL,0x1
		INT 0x21
		MOV oldInt1Seg,ES
		MOV oldInt1Offset,BX
		
		MOV AH,0x35
		MOV AL,0x3
		INT 0x21
		MOV oldInt3Seg,ES
		MOV oldInt3Offset,BX
	}  
	
	printf("Load new interrupts SEG:OFF\n");    
	
	__asm
	{
		MOV AH,0x25
		MOV AL,0x1
		PUSH DS
		MOV CX,CS
		MOV DS,CX
		MOV DX,OFFSET int1
		INT 0x21
		POP DS
		
		MOV AH,0x25
		MOV AL,0x3
		PUSH DS
		MOV CX,CS
		MOV DS,CX
		MOV DX,OFFSET int3
		INT 0x21
		POP DS
	}
	 
	/* actually do something here to provoke debugger -------------*/ 
	
	__asm
	{
		INT 3
		
		MOV DX,20  
		INC DX
		NOP
		MOV DX,3501
		MOV DX,72  
		DEC DX
	}
    
    printf("Re-loading old interrupts SEG:OFF\n");   
    
	__asm
	{   
		PUSH DS
		MOV AH,0x25
		MOV AL,0x1
		MOV DS,oldInt1Seg
		MOV DX,oldInt1Offset 
		INT 0x21
		POP DS
		
		PUSH DS
		MOV AH,0x25
		MOV AL,0x3
		MOV DS,oldInt3Seg
		MOV DX,oldInt3Offset  
		INT 0x21
		POP DS
	}
	return; 
}/*end main*/  

void procCmd(int *lptr)
{   
	char ch;
	    
	traceOn=0;  
	
	printf("dbg>");
	scanf("%c",&ch); 
	fflush(stdin);   
	
	switch(ch)
	{
		case 'a':
		{
			printf("INT1_STR address=%u\n",INT1_STR);	
		}break;
		case 'd':
		{
			printf("CS=%u\n",rCS);
			printf("SS=%u\n",rSS);
			printf("DS=%u\n",rDS);
			printf("AX=%d\n",rAX);
			printf("BX=%d\n",rBX);
			printf("CX=%d\n",rCX);
			printf("DX=%d\n",rDX);
		}break;
		case 'i':
		{
			rAX++;
			printf("AX=%d\n",rAX);
		}break;
		case 'm':
		{   
			int i;
			unsigned long address; 
			unsigned long limit = rCS+65535;
			unsigned char *sptr;
			printf("memory address>");
			scanf("%lu",&address);
			fflush(stdin);
			sptr = (unsigned char*)address;
			printf("address=%u\n",sptr); 
			if(address > limit)
			{
				printf("address is beyond .COM segment\n");
			}
			else
			{
				for(i=0;i<16;i++)
				{ 
					if((sptr[i]>0x20)&&(sptr[i]<0x7F))
					{ 
						printf("byte[%lu]=%c\n",address+i,sptr[i]); 
					}
					else
					{
						printf("byte[%lu]=%X\n",address+i,sptr[i]); 	
					}
				}
			}
		}break;
		case 'q':
		{ 
			*lptr=0; 
		}break;   
		case 't':
		{          
			traceOn=1; 
			printf("trace flag set\n");
			*lptr=0;
		}break;
		default:
		{ 
			printf("not valid command\n"); 
		}
	} 
	return;
}/*end procCmd*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -