中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-14 23:49
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » C语言使用中断跳转指令RET示例!
楼 主 C语言使用中断跳转指令RET示例! 发表于 2003-11-07 00:00 ·  中国 河北 石家庄 电信
中级用户
★★
疯狂的流浪者
积分 276
发帖 56
注册 2003-09-25 00:00
UID 10329
性别 男
状态 离线
C语言使用中断跳转指令RET示例!
/*********************************************/
/*    C语言使用中断跳转指令示例     */
/*       作者:xy_god         */
/*      tc2.0下调试通过        */
/*********************************************/
#include "dos.h"
#include "stdio.h"
#include "conio.h"

void setretint();         /*设置96H中断为中断跳转中断,
                   入口地址如下:x,段地址;bx,偏
                   移地址*/

void retf(int destseg,int destoff);/*跳转到destseg:destoff去运行*/

main()/*****************主函数**************************/
{
int segsrc=0x2000,offsrc=0x0000;int i=0;
char abscode={0x00,0x0D,0xB4,0x09,0x00,0x0F,/*机器指令代码*/
         0xB0,0x2A,0x00,0x11,0xB7,0x00,
         0x00,0x13,0xB3,0xDA,0x00,0x15,
         0xB9,0x05,0x00,0x00,0x18,0xCD,0x10};
for(i=0;i<=24;i++)
pokeb(segsrc,offsrc+i,abscode);
setretint();
retf(0x2000,0x000);
}

void retf(int destseg,int destoff) /*跳转到destseg:destoff去运行*/
{
asm mov cx,destseg
asm mov bx,destoff
asm int 96h
}

void setretint()/*设置96H中断为中断跳转中断,
         入口地址如下:
         cx,段地址,bx,偏移地址*/
{
int segsrc=0x1000,offsrc=0x0000;int i=0;
char abscode={0x8B,0xC1, /*MOV   AX,CX*/
         0x50,   /*PUSH  AX  */
         0x8B,0xC3,/*MOV   AX,BX*/
         0x50,   /*PUSH  AX  */
         0xCB};  /*RETF     */
for(i=0;i<=6;i++)
pokeb(segsrc,offsrc+i,abscode);
asm MOV AX,1000h /*设置96h中断的入口地址*/
asm MOV DS,AX
asm MOV DX,0000h
asm MOV AL,96h
asm MOV AH,25H
asm INT 21H
}

临河居士
http://www.xygod.pc5.org
2 发表于 2003-11-07 00:00 ·  中国 河北 石家庄 电信
中级用户
★★
疯狂的流浪者
积分 276
发帖 56
注册 2003-09-25 00:00
UID 10329
性别 男
状态 离线
上次些了个汇编的执行机器指令的代码居然没有人回,这次来个C语言版的,看看是不是可以共同研究一下!呵呵!
临河居士
http://www.xygod.pc5.org
3 发表于 2004-02-03 00:00 ·  中国 福建 福州 电信
初级用户
积分 139
发帖 17
注册 2004-02-03 00:00
UID 16635
性别 男
状态 离线
这个太麻烦,直接这样即可:
void retf(int destseg,int destoff) /*跳转到destseg:destoff去运行*/
{
asm push destseg
asm push destoff
asm retf
}

4 发表于 2004-02-03 00:00 ·  中国 湖北 武汉 联通
高级用户
★★
积分 677
发帖 194
注册 2003-09-13 00:00
UID 9778
性别 男
状态 离线
我能不能来个QB的??
论坛跳转: