. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->综合研究
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  寻求帮助,研究实验3(2)的问题  [待解决] 回复[ 11次 ]   点击[ 793次 ]  
woshiwo
[帖 主]   [ 发表时间: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';
}
lwbfq
[第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()只相当于一个子函数,程序的真正执行不是从它开始的,这在汇编中是经常提到的。
lwbfq
[第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的值是不能随便更改的。
woshiwo
[第3楼]   [ 回复时间:2009-03-23 21:51 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-18 21:33
谢谢,经过您的点拨,问题解决了。以前不知道“进入main()前,AX或DS中的值是有其它意义的”。看来我还是理解得不够通彻,还得下功夫啊。
十分感谢您的帮助,谢谢!
mywiil
[第4楼]   [ 回复时间:2009-03-25 15:27 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:4
注册日期:2008-10-14 16:29
收益匪浅啊!谢谢两位啦。
yanjiajia
[第5楼]   [ 回复时间:2009-04-05 14:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-17 21:34
寄存器的使用我们是不能预知的!做任何操作之前,应该保存.一面出错!
aten
[第6楼]   [ 回复时间:2009-04-20 12:00 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2008-12-11 08:43
只用一条语句:其实思想还是和原来学汇编时的一样!
main()
{
 *(int far *)0xb8780050=0x0261;
}
aten
[第7楼]   [ 回复时间:2009-04-20 12:29 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2008-12-11 08:43
学习了,嘿嘿!
zjxiaogaoren
[第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个字节
yinxiaohong
[第9楼]   [ 回复时间:2009-04-28 19:10 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-03 16:13
int 不是4个字节码?怎么会是2个呢?麻烦解释一下吧
yanjiajia
[第10楼]   [ 回复时间:2009-04-29 17:29 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-17 21:34
int是2个字节的!c语言书杀上也有说明!
zjkl19
[第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个字节。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved