|
本帖最后由 不点 于 2019-10-31 16:40 编辑
这次的错误其实只有一个:都是不认识 %cs:*(ROM_int15 - int13_handler)
这很容易搞。试试两个办法,其一,试试去掉星号,看看能否通过。其二,那就得手动替它汇编了。手动汇编还得查阅 intel 相关指令手册。你就先试试去掉星号,看看怎么样?
不支持 -mpreferred-stack-boundary=2 没关系,这个参数不重要。
lcall 和 ljmp 就相当于微软汇编里面的 call far 和 jmp far。
有个偷懒的办法,可以不用查阅 intel 手册,就能知道
ljmp %cs:*(ROM_int15 - int13_handler)
能够编码成什么字节串。
在 gcc 编译的情况下,你在
ljmp %cs:*(ROM_int15 - int13_handler)
的前后插入一些垃圾字节,比如这样:
.ascii "hihihi" // 这些垃圾字节当然不可以出现在正式使用的编译结果中
ljmp %cs:*(ROM_int15 - int13_handler)
.ascii "hello!" // 这些垃圾字节当然不可以出现在正式使用的编译结果中
然后,你在编译结果中查找这些字符串,就能知道两个字符串中间的编译结果了。然后,通过猜测,就能知道指令代码 ljmp 和 cs 前缀分别是啥,以及跟着的参数(ROM_int15 - int13_handler) 的值。于是,就可以用
.byte 0x?? // 这应该是 cs 前缀,也就是前面曾经用过的 0x2E
.byte 0x?? // 这个应该是 ljmp 间接寻址的指令码,究竟是单字节还是两个字节,我不太确定。如果是俩字节,那就是 .byte 0x?? , 0x?? 的格式。
.word (ROM_int15 - int13_handler)
来构造汇编代码,让 clang 能够运转了。
同理,lcall 的情况也可以用这种方法来处理。
|
|