当前位置: 首页 > news >正文

鹤壁网站开发茂名做网站的公司

鹤壁网站开发,茂名做网站的公司,如何建设微网站,做淘宝客网站用什么程序好28.1 alloca __alloca 会在下述情况下被 C 语言的程序调用(采用 near-CALL 的方式)。 1、要执行的操作从栈中分配 EAX 个字节的内存空间( ESP - EAX; ) 2、要遵守的规则不能改变 ECX 、 EDX 、 EBX 、 EBP 、 ESI 、 EDI的值&am…

28.1 alloca

__alloca 会在下述情况下被 C 语言的程序调用(采用 near-CALL 的方式)。
1、要执行的操作从栈中分配 EAX 个字节的内存空间( ESP -= EAX;
2、要遵守的规则不能改变 ECX EDX EBX EBP ESI EDI的值(可以临时改变它们的值,但要使用 PUSH/POP 来复原)
RET 返回的地址保存在了ESP(“RET”指令实际上相当于“POP EIP”,“POP EIP”实际上又相当于下面两条指令:MOV EIP,[ESP]    ADD ESP,4)。为实现类似RET功能指令,所以编写了如下 __alloca函数指令。
__alloca:
        SUB  ESP,EAX
        ADD  ESP,4
        JMP  DWORD [ESP+EAX-4] ; 代替 RET
注:C语言中,在函数外部声明的变量和带static的变量一样,都会被解释为DB和RESB;在函数内部不带static声明的变量则会从栈中分配空间。

28.2 文件操作API 

需要实现的功能:打开、定位、读取、写入和关闭文件。思路:打开文件时需要指定文件名,如果打开成功,操作系统将返回文件句柄。在随后的操作中,只要提供这个文件句柄就可以进行读写操作了,操作结束后将文件关闭。读取和写入API基本上需要指定需要读取(写入)的数据长度以及内存地址,文件的内容会被传送至内存(写入操作时是由内存传送至文件)。
打开文件
关闭文件
文件定位
获取文件大小
文件读取
EDX=21
EBX= 文件名
EAX= 文件句柄(为 0 时表示打开失败)(由操作系统返回)
EDX=22
EAX= 文件句柄
EDX=23
EAX= 文件句柄
ECX= 定位模式
        =0:定位的起点为文件开头
        =1:定位的起点为当前的访问位置
        =2:定位的起点为文件末尾
EBX= 定位偏移量
EDX=24
EAX= 文件句柄
ECX= 文件大小获取模式
       =0:普通文件大小
       =1:当前读取位置从文件开头起算的偏移量
       =2:当前读取位置从文件末尾起算的偏移量
EAX= 文件大小(由操作系统返回)
EDX=25
EAX= 文件句柄
EBX= 缓冲区地址
ECX= 最大读取字节数
EAX= 本次读取到的字节数(由操作系统返回)
/*                    bootpack.h                    */
struct TASK {(中略)int ds_base, cons_stack;struct FILEHANDLE *fhandle; /*从此开始*/int *fat; /*到此结束*/
};
struct FILEHANDLE { /*从此开始*/char *buf;int size;int pos;
}; /*到此结束*//*                    console.c                    */
void console_task(struct SHEET *sheet, int memtotal)
{(中略)struct FILEHANDLE fhandle[8];(中略)for (i = 0; i < 8; i++) fhandle[i].buf = 0; /*未使用标记*/task->fhandle = fhandle;task->fat = fat;(中略)
}if (finfo->size >= 36 && strncmp(p + 4, "Hari", 4) == 0 && *p == 0x00) {//cmd_app代码片段(中略)start_app(0x1b, 0 * 8 + 4, esp, 1 * 8 + 4, &(task->tss.esp0));(中略)for (i = 0; i < 8; i++) { /*将未关闭的文件关闭*/ /*从此开始*/if (task->fhandle[i].buf != 0) {memman_free_4k(memman, (int) task->fhandle[i].buf, task->fhandle[i].size);task->fhandle[i].buf = 0;}} /*到此结束*/(中略)
}int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax){(中略)struct FILEINFO *finfo;struct FILEHANDLE *fh;struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;(中略)
/*开始*/}else if(edx == 21){//打开文件for(i = 0; i < 8; i++){if(task->fhandle[i].buf == 0)break;}fh = &task->fhandle[i];reg[7] = 0;if(i < 8){finfo = file_search((char*)ebx+ds_base, (struct FILEINFO*)(ADR_DISKIMG+0x002600), 224);if(finfo != 0){reg[7] = (int)fh;fh->buf = (char *) memman_alloc_4k(memman, finfo->size);fh->size = finfo->size;fh->pos = 0;file_loadfile(finfo->clustno, finfo->size, fh->buf, task->fat, (char *)(ADR_DISKIMG+0x003e00));}}}else if(edx == 22){//关闭文件fh = (struct FILEHANDLE*)eax;memman_free_4k(memman, (int)fh->buf, fh->size);//与打开文件操作中的memman_alloc_4k对应fh->buf = 0;}else if(edx == 23){//文件定位fh = (struct FILEHANDLE*)eax;if(ecx == 0){//定位的起点为文件开头fh->pos = ebx;}else if(ecx == 1){//定位的起点为当前的访问位置fh->pos += ebx;}else if(ecx == 2){//定位的起点为文件末尾fh->pos = fh->size + ebx;}if(fh->pos < 0)fh->pos = 0;if(fh->pos > fh->size)fh->pos = fh->size;}else if(edx == 24){//获取文件大小fh = (struct FILEHANDLE*)eax;if(ecx == 0){//普通文件大小reg[7] = fh->size;}else if(ecx == 1){//当前读取位置从文件开头起算的偏移量reg[7] = fh->pos;}else if(ecx == 2){//当前读取位置从文件末尾起算的偏移量reg[7] = fh->pos - fh->size;}}else if(edx == 25){//文件读取,写入到ebx缓存区中fh = (struct FILEHANDLE*)eax;for(i = 0; i < ecx; i++){if(fh->pos == fh->size)break;*((char *) ebx + ds_base + i) = fh->buf[fh->pos];fh->pos++;}reg[7] = i;
/*结束*/}return 0;
}

28.3 命令行API 

需要实现的功能:在用户输入“type ***.nas”这样的命令时获取后面的文件名。
获取命令行
EDX=26
EBX= 存放命令行内容的地址
ECX= 最多可存放多少字节
EAX= 实际存放了多少字节(由操作系统返回)
/*                    a_nask.nas                    */
_api_cmdline: ; int api_cmdline(char *buf, int maxsize);PUSH EBXMOV EDX,26MOV ECX,[ESP+12] ; maxsizeMOV EBX,[ESP+8] ; bufINT 0x40POP EBXRET
/*                    bootpack.h                    */
struct TASK {(中略)char *cmdline;
};/*                    console.c                    */
void console_task(struct SHEET *sheet, int memtotal)
{(中略)task->cons = &cons;task->cmdline = cmdline; /*这里!*/(中略)
}int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax)
{(中略)} else if (edx == 26) {i = 0;for (;;) {*((char *) ebx + ds_base + i) = task->cmdline[i];if (task->cmdline[i] == 0) {break;}if (i >= ecx) {break;}i++;}reg[7] = i;}return 0;
}
http://www.15wanjia.com/news/182412.html

相关文章:

  • 网页设计网络培训站长工具的使用seo综合查询排名
  • 株洲网站建设的公司网站前端建设都需要什么问题
  • 网站推广方案策划案例旅游网站建设策划方案
  • 网站搜索算法软件技术有限公司
  • 网站开发会计处理门户网站 建设商 排名
  • 做网站如何大网页临沂网站公众号建设
  • 网站设计制作费用手机设计房子的软件
  • 贾汪微网站开发垂直类网站怎么做推广
  • 厦门外贸商城网站建设综合服务门户网站建设
  • wordpress栏目页面排名优化培训
  • 广州市建设集团网站首页有关做详情页的参考网站
  • 第五届中国国际进口博览会召开时间简述什么是seo
  • 普通网站设计公司注册网站需要什么条件
  • 网站项目需求表深圳网站搭建找哪里
  • 上海网站建设制作百橙企业推广网站建设报价
  • 网站注册实名制怎么做微商城网站建设
  • 域名注册完成后怎么做网站郑州做网站电话
  • 运城个人网站建设广安做网站公司
  • 贵阳企业网站建设广东省公路建设公司官方网站
  • 楼市最新消息2022南昌seo哪家好
  • seo与网站建设的关联山东济南网站建设公司
  • 股票实时交易网站开发自己做的网站怎么发布上
  • 做招聘网站价格怎样建立一个公司网站
  • 济南建设网站公司哪个好域名如何绑定网站
  • 大连模板建站定制短视频seo优化
  • 核工业华南建设工程集团公司网站cnzz
  • 清远医院网站建设费用手机网站开源系统
  • 上海网站建设定制公司优化服务内容
  • 湘潭网站设计搭建网站都需要什么
  • html5 图片网站模板充值中心网站怎么做