研究试验4

研究试验4

不使用 main 函数

编写程序 f.c

f()
{
    *(char far *)(0xb8000000 + 160 * 10 + 2 * 40) = 'a';
    *(char far *)(0xb8000000 + 160 * 10 + 2 * 40 + 1) = 2;
}

1. 将程序保存在 minc 目录下 编译链接

  1. 在连接过程中会出现问题
    • image-20200608170212786
  2. 提示出的缺少 _main
  3. 可能与 C0S 有关

2. 用学习汇编是的 link.exetc.exe 生成的 f.obj 进行连接 生成 f.exe

  1. 由图中可见总共由 303 个字节
    • image-20200608170929124
  2. 函数 f 实现了其功能 在屏幕中打印出 a
    • image-20200608171139742
    • 但是函数不能正常结束 Dosbox 会卡死后然后退出
      • image-20200608171415211
  3. debug 后可见 f函数的偏移地址为0
    • image-20200608171625247

3. 写一个 m.c 在 编译 连接

main()
{
    *(char far *)(0xb8000000 + 160 * 10 + 2 * 40) = 'a';
    *(char far *)(0xb8000000 + 160 * 10 + 2 * 40 + 1) = 2;
}
  1. 由图可见代码总长为 4280 个字节
    • image-20200608172758289
  2. 由图可见 m.exe 可以正常返回 因为在执行玩 m.exe 后还可以在命令行输入新的命令
    • image-20200608173027098
  3. m.exe 的汇编代码中main 的偏移地址为 01faf.exef 的偏移地址为 0000
    • main
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SWBas6Bz-1592729246469)(0608-%E7%A0%94%E7%A9%B6%E8%AF%95%E9%AA%8C4-%E5%AE%A3%E8%AE%B2%E4%BC%9A%E7%A0%94%E7%A9%B6%E6%8A%A5%E5%91%8A-%E5%B0%B9%E5%BF%A0%E6%81%A9.assets/image-20200608171625247.png)]

4. debug 对 m.exe 进行跟踪

  1. 跳转到main函数开始地址
    • image-20200608173857741
  2. 执行到 ret 后 跳转到 了 076a:011d
    • image-20200608174106973
    • 由图可以看到 在 07fa:011a 中调用 main
      • image-20200608174432350
  3. 在执行完image-20200608175623677划红线的ret 然后一直按p 会找到程序的返回指令为 int 21
    • image-20200608174723076

5. 思考问题

  1. main函数的调用指令和程序返回指令应该是c0s中对应的代码中调用的
  2. 没有main 函数,提示错误信息中由 “c0s” 的相关信息,因该是 tc.exe 把 在搭建环境时所需要的 文件 和 用户的 obj 生成 .exe 而不单单是 一个 c0s.obj
  3. 调用 main 函数的指令 因该来自于 c0s.obj
  4. link.exe 连接 c0s.obj
  5. debug 后的 c0s.exe
    1. image-20200608182441695
    2. image-20200608182616287
    3. 可以看见基本结构和由用户生成的包含main 函数的基本结构相似

6. 用link.exec0s.obj 连接生成 c0s.exe

c0s.exem.exe
image-20200608183128613image-20200608184824390
image-20200608183211934image-20200608184840521
image-20200608183244482image-20200608184854759

由上图可知代码开头部分两者的开始部分都相同

7. 对比 m.exec0s.exe 中调用main函数的call指令的偏移地址的后10条指令

c0s.exem.exe
image-20200608190030232image-20200608185534954

由上图可知前10行有3行调用的不同 第一个为调用main函数然后返回到 c0s.obj 中的 076a:011d,其余的call应该也是完成相关任务后返回 c0s.oj

8. 改写 c0s.obj

  1. 编写c0s.obj

    assume cs:code
    data segment
    
    DB 128 dup(0)
    
    data ends
    
    code segment
    start:
        mov ax,data
        mov ds,ax
        mov ss,ax
        mov sp,128
    
        call s
    
        mov ax,4c00h
        int 21h
    
        s:
    code ends
    end start
    
  2. masm 生成 c0s.obj

  3. tc 中 打开 f.c 编译 连接 后可以正常生成 f.exe

    image-20200608192023362

9 debug f.exe

image-20200608192142927

image-20200608192223397

可以看到程序正确的调用了 f()

疑问:

为什么汇编代码中仅仅调用了 s 然后 s 什么都没用,连接完后就把f函数自动填充过去到 s 处

10 编写新的f.c

#define Buffer ((char *)*(int far *)0x02000000)
f()
{
    Buffer = 0;
    Buffer[10] = 0;
    while (Buffer[10] != 8)
    {
        Buffer[Buffer[10]] = 'a' + Buffer[10];
        Buffer[10]++;
    }
}

debug 后的 f.exe

  • image-20200608210836686
  • image-20200608210902645
  • image-20200608210921844
  • image-20200608211211498

可以看到编译连结完debug后的代码逻辑和汇编代码逻辑基本一致

感悟

C0S.OBJ的功能就是进行相关初始化,申请资源、设置DS、SS等寄存器,并且在MAIN函数结束后进行相关资源的释放、环境恢复等工作,随后调用DOS的21H程序返回。

  • [外链图片转存中…(img-rWtudEKQ-1592729246649)]

可以看到编译连结完debug后的代码逻辑和汇编代码逻辑基本一致

感悟

C0S.OBJ的功能就是进行相关初始化,申请资源、设置DS、SS等寄存器,并且在MAIN函数结束后进行相关资源的释放、环境恢复等工作,随后调用DOS的21H程序返回。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本项目是一个基于SpringBoot开发的华府便利店信息管理系统,使用了Vue和MySQL作为前端框架和数据库。该系统主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的Java学习者,包含项目源码、数据库脚本、项目说明等,有论文参考,可以直接作为毕设使用。 后台框架采用SpringBoot,数据库使用MySQL,开发环境为JDK、IDEA、Tomcat。项目经过严格调试,确保可以运行。如果基础还行,可以在代码基础之上进行改动以实现更多功能。 该系统的功能主要包括商品管理、订单管理、用户管理等模块。在商品管理模块,可以添加、修改、删除商品信息;在订单管理模块,可以查看订单详情、处理订单状态;在用户管理模块,可以注册、登录、修改个人信息等。此外,系统还提供了数据统计功能,可以对销售数据进行统计和分析。 技术实现方面,前端采用Vue框架进行开发,后端使用SpringBoot框架搭建服务端应用。数据库采用MySQL进行数据存储和管理。整个系统通过前后端分离的方式实现,提高了系统的可维护性和可扩展性。同时,系统还采用了一些流行的技术和工具,如MyBatis、JPA等进行数据访问和操作,以及Maven进行项目管理和构建。 总之,本系统是一个基于SpringBoot开发的华府便利店信息管理系统,使用了Vue和MySQL作为前端框架和数据库。系统经过严格调试,确保可以运行。如果基础还行,可以在代码基础之上进行改动以实现更多功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值