荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: sinba (CL, never fly away!), 信区: Program
标 题: 操作系统课程设计——建议7
发信站: BBS 荔园晨风站 (Sun Oct 31 11:44:25 1999), 转信
(test3部分)
对操作系统可真算服了,我现在还搞不懂,在large模式下,
汇编各模块之间有什么不同。各有自己的ds,cs?
为这样一个问题弄了一整天,解决之道令我自己都说不出
所以然来,现提出以供大家指正。
我在system.asm中定义:
...
public _fun00_ip
public _fun00_cs
public _fun01_ip
public _fun01_cs
public _f04_ip
public _f04_cs
_data2 segment word public 'data2'
_fun00_ip dw 0
_fun00_cs dw 0
_fun01_ip dw 0
_fun01_cs dw 0
_f04_ip dw 0
_f04_cs dw 0
_data2 ends
_text segment public 'code'
assume cs:_text,ds:_data2
...
在real.asm有
extrn _gotim_sch1:far
extrn _time: word
extrn _work1: word
public _ip00
public _cs00
public _ip00_t2
public _cs00_t2
_data segment word public 'data'
_ip00 dw 0
_cs00 dw 0
_ip00_t2 dw 0
_cs00_t2 dw 0
_h8ip dw 0
_h8cs dw 0
_inseg dw 0
_inea dw 0
_data ends
_text segment public 'code'
assume cs:_text,ds:_data
...
然后在调用时
push _f04_cs
push _f04_ip
ret
总是说cpu遇到非法指令。
用栈检查(源程序见前面文章),发现f04_cs,f04_ip在c下打印值正确,一旦
push到栈中就变了值(如果这时返回便出错),而回到c中又打印正确值。怎么
查都不想不通到底哪里错了。让人要跳楼的是同样操作的cs00,ip00却很正常。
狠狠心,大换血,将在system.asm的定义全改在real.asm中(违反常理),
程序如下:
real.asm:
public _ip00
public _cs00
public _ip00_t2
public _cs00_t2
public _fun00_ip
public _fun00_cs
public _fun01_ip
public _fun01_cs
public _f04_ip
public _f04_cs
_data segment word public 'data'
_ip00 dw 0
_cs00 dw 0
_ip00_t2 dw 0
_cs00_t2 dw 0
_h8ip dw 0
_h8cs dw 0
_inseg dw 0
_inea dw 0
_fun00_ip dw 0
_fun00_cs dw 0
_fun01_ip dw 0
_fun01_cs dw 0
_f04_ip dw 0
_f04_cs dw 0
_data ends
_text segment public 'code'
assume cs:_text,ds:_data
...
而system.asm为:
...
extrn _fun00_ip: word
extrn _fun00_cs: word
extrn _fun01_ip: word
extrn _fun01_cs: word
extrn _f04_ip : word
extrn _f04_cs : word
_text segment public 'code'
assume cs:_text
...
程序恢复正常,压栈值和c的打印值均正常,
system.asm中的调用:
push _f04_cs
push _f04_ip
ret
工作正常,程序正常结束。
些许高兴之余,想从7楼跳下去,大侠们拉我一把!
--
※ 来源:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.1.145]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店