|
主题 : : 寻求帮助,研究实验3(2)的问题 [待解决] |
回复[ 11次 ]
点击[ 793次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-03-21 19:32 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-18 21:33 |
原题是这样的"(2) 编写一个程序,用一条c语句实现在屏幕的中间显示一个绿色的字符'a'"
我是这么写的:*(int far *)0xb80007d0=0x0261;显示正常,然后我按照汇编思路开始改写成如下代码:
AX=0xb800;
_DS=_AX;
*(char *)0x7d1=2;
*(char *)0x7d0='a';
绿色的a虽然可以显示,但在屏幕上方总有其他一个字符,更怪的是用debug调试时,在b800:07d1区域里连61(就是字符a)都没有!可是屏幕上的a也可以显示啊,在a 右上边也有字符这又是为什么呢?是我这四行c代码不对吗?恳请大家帮助。如果我说得还不清楚,请大家把下面的代码拷贝过去,看下效果
main()
{
_AX=0xb800;
_DS=_AX;
*(char *)0x7d1=2;
*(char *)0x7d0='a';
} | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-03-23 12:49 ]
[引用]
[回复]
[ top ] | |
荣誉值:56
信誉值:0
注册日期:2008-01-19 13:58 |
程序执行后,会提示“Abnormal program termination”,非正常的程序结束。
应该是你的main()中对寄存器AX和DS近行了赋值操作,但是在退出时没有恢复现场,即没有把AX和DS恢复到进入main()函数前的状态,而进入main()前,AX或DS中的值是有其它意义的,退出时没有恢复就很有可能会出问题,因为main()只相当于一个子函数,程序的真正执行不是从它开始的,这在汇编中是经常提到的。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2009-03-23 12:52 ]
[引用]
[回复]
[ top ] | |
荣誉值:56
信誉值:0
注册日期:2008-01-19 13:58 |
main()
{
_BX=_DS;
_AX=0XB800;
_DS=_AX;
*(char *)0x7d1=2;
*(char *)0x7d0='a';
_DS=_BX;
}
这就没问题了,所以可以验证,DS的值是不能随便更改的。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-03-23 21:51 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-18 21:33 |
谢谢,经过您的点拨,问题解决了。以前不知道“进入main()前,AX或DS中的值是有其它意义的”。看来我还是理解得不够通彻,还得下功夫啊。
十分感谢您的帮助,谢谢! | | |
|
|
|
|
[第4楼]
[ 回复时间:2009-03-25 15:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:61
信誉值:4
注册日期:2008-10-14 16:29 |
|
|
|
|
|
[第5楼]
[ 回复时间:2009-04-05 14:48 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-17 21:34 |
寄存器的使用我们是不能预知的!做任何操作之前,应该保存.一面出错! | | |
|
|
|
|
[第6楼]
[ 回复时间:2009-04-20 12:00 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2008-12-11 08:43 |
只用一条语句:其实思想还是和原来学汇编时的一样!
main()
{
*(int far *)0xb8780050=0x0261;
} | | |
|
|
|
|
[第7楼]
[ 回复时间:2009-04-20 12:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2008-12-11 08:43 |
|
|
|
|
|
[第8楼]
[ 回复时间:2009-04-27 13:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:1
注册日期:2009-04-20 20:16 |
main()
{
*(int far *)0xb8780050=0x0200;
*(char far *)0xb8780050='a';
}
这样写也可以实现,发现了int是2个字节,char是1个字节 | | |
|
|
|
|
[第9楼]
[ 回复时间:2009-04-28 19:10 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-03 16:13 |
int 不是4个字节码?怎么会是2个呢?麻烦解释一下吧 | | |
|
|
|
|
[第10楼]
[ 回复时间:2009-04-29 17:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-17 21:34 |
|
|
|
|
|
[第11楼]
[ 回复时间:2010-05-10 23:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:6
注册日期:2009-07-15 11:17 |
回复:[第9楼]
------------------
不同的C语言编译器对int占有的字节数处理不同,VC6.0分配int 4个字节,tc2.0分配int 2个字节。 | | |