免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10019 | 回复: 13
打印 上一主题 下一主题

[C] 如何将汇编语言对应的二进制码写入文件(*.obj) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-08 05:46 |只看该作者 |倒序浏览
100可用积分
已经解决了的问题,不过估计各位看了我的N个回帖后会和鄙人一样无语...
偶抱着"支持"盖茨以及ultraedit/cuteftp/putty的态度,在这几种软件中转了一个晚上...困死...
大家权当笑话看吧-_-||

计算机架构作业,要写一个简单汇编语言的编译器-_-||(因为有操作码数值对照表,所以懂不懂汇编没有关系,我也不懂,我只要正确生成obj文件就形)
我好不容易做好语法分析,将代码转化为hex码了
比如:

地址   oprand(前6位) opcode(后2位)
0000 FFFFFF01

我如何将这个内容以二进制方式写入obj文件?(我知道用fopen的wb参数,但不知道用什么方式写入才能达到下面附件中memcpy.o的效果)
附件中memcpy.o是一个样本obj文件,可以用ultraedit之类的hex编辑器打开,另一个memcpy.l是asm文件内容和他的对应hex码,memcpy.asm是asm文件

请大侠指点一二,谢谢

(这个月我已经写了一个Turtle语言编译器了(c语言作业,还好这个编译器只是把代码编译成图形),上面的计算机架构作业是我这个月要写的第二个编译器...痛苦中...这学校作业非常难,圣诞1个月假期天天写代码...现在时间有些紧迫,望哪位大侠指点一二,十二分感激)

[ 本帖最后由 kelela 于 2008-1-9 18:23 编辑 ]

asm.rar

1.89 KB, 下载次数: 156

最佳答案

查看完整内容

fwrite(buffer, 1, len, fp);你的指令在buffer中存放,len是buffer的长度。没有什么特殊之处呀。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2008-01-08 05:46 |只看该作者
fwrite(buffer, 1, len, fp);
你的指令在buffer中存放,len是buffer的长度。
没有什么特殊之处呀。

论坛徽章:
0
3 [报告]
发表于 2008-01-08 09:09 |只看该作者
编译器,恩,不错,偶大学学编译的时候都没动手写过,鼓励一个

论坛徽章:
0
4 [报告]
发表于 2008-01-08 10:20 |只看该作者
麻烦的地方都已经解决了,楼主怎么反而在简单的地方卡壳了呢。

论坛徽章:
0
5 [报告]
发表于 2008-01-08 10:58 |只看该作者
原帖由 lenovo 于 2008-1-8 10:09 发表
fwrite(buffer, 1, len, fp);
你的指令在buffer中存放,len是buffer的长度。
没有什么特殊之处呀。

没这么简单吧。
要注意 obj 采用什么格式,如果是 flat-form binary 的话,可以这么做,但大多数 object 文件都不是这种格式。

论坛徽章:
0
6 [报告]
发表于 2008-01-08 10:59 |只看该作者
编译完了,还要链接,链接同样很麻烦。编译的话,只要理论学好了就行了,链接的话,还得看很多文档,了解工业规范。

论坛徽章:
0
7 [报告]
发表于 2008-01-09 13:00 |只看该作者
打个比方,第一列是地址,第二列是地址对应的数值
后面是原始的汇编码(不用管它)
我把地址和数值全都算出来了,问题是,我如何能把数值和地址写入一个新建的obj文件中(二进制形式,就像附件中的memcpy.o文件那样,像是memory dump)
这个问题比较傻,但是我第一次接触这种问题,所以望各位大侠指点了,再次感谢
0000 00100000         ldc 0x1000
0001 0000000B         a2sp
0002 FFFFFE0A         adj -2
0003 00000A00         ldc   10
0004 00000103         stl   1
0005 00002000         ldc   src
0006 00000003         stl   0
0007 00002C00         ldc   dst
0008 0000010D         call  memcpy
原帖由 lenovo 于 2008-1-8 10:09 发表
fwrite(buffer, 1, len, fp);
你的指令在buffer中存放,len是buffer的长度。
没有什么特殊之处呀。

非常感谢,我试了一下,处理正数可以,但负数会变成奇怪的符号,不知道为什么
比如
int a=6;
...
fwrite(&a,sizeof(int),1,fp);
fp指向的文件中hex码是对的,但是如果是-6就不对了,转换成补码,long int又会溢出.
不知道为什么,这个方面我几乎没什么经验
刚才试了很久,并不是一个简单问题,obj文件的创建,没有我想象中那么简单
比如把-1写入obj,hex码应该是FFFFFFFF,但是我用fwrite无法做到这一点,为了避免溢出等等条件我做了很大努力,但在写入时还是达不到要求
现在就剩一个问题,简单些说,就是:
如果我有一个long int为-1
我如何把它写入obj,并且hexediter打开可以看见hex码为FFFFFFFF?
一晚上把其他模块都搞定了,就是这里卡住,代码超过1000行了...
这学校计算机专业难度在英国仅次牛剑...题目也不是那么容易就搞定的

[ 本帖最后由 kelela 于 2008-1-9 15:50 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-01-09 14:53 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
9 [报告]
发表于 2008-01-09 16:43 |只看该作者
顶一下,现在的问题是:
如何把一个long int数(比如-1)写入一个二进制文件,并且用ultraedit打开显示为FFFFFFFF
FILE *fp;
long a=-1;
fp=fopen("test.o","wb");
fwrite(&a,sizeof(long),1,fp);

这样确实是可以把数值写入,并且再读出数值也是对的,但是ultraedit打开却不能显示FFFFFFFF(分了2行,无法显示正确的字符),为什么呢?一晚上百思不解,google无数遍...实在不理解

[ 本帖最后由 kelela 于 2008-1-9 16:48 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2008-01-09 17:31 |只看该作者
你要是写int,long int之类的,
使用fprintf呀。有格式控制的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP