汇编网首页登录博客注册
aten的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
友情链接

[2009-04-21 13:17] 研究试验3 使用内存空间

(1)编写一个程序um1.c:
main()
{
 *(char *)0x2000='a';
 *(int *)0x2000=0xf;
 *(char far *)0x20001000='a';
 _AX=0x2000;
 *(char *)_AX='b';
 _BX=0x1000;
 *(char *)(_BX+_BX)='a';
 *(char far *)(0x20001000+_BX)=*(char *)_AX;
}


1412:01FA 55            PUSH    BP
1412:01FB 8BEC          MOV     BP,SP
1412:01FD C606002061    MOV     BYTE PTR [2000],61
1412:0202 C70600200F00  MOV     WORD PTR [2000],000F
1412:0208 BB0020        MOV     BX,2000
1412:020B 8EC3          MOV     ES,BX
1412:020D BB0010        MOV     BX,1000
1412:0210 26            ES:
1412:0211 C60761        MOV     BYTE PTR [BX],61
1412:0214 B80020        MOV     AX,2000
1412:0217 8BD8          MOV     BX,AX
1412:0219 C60762        MOV     BYTE PTR [BX],62
1412:021C BB0010        MOV     BX,1000
1412:021F 03DB          ADD     BX,BX
1412:0221 C60761        MOV     BYTE PTR [BX],61
1412:0224 8BD8          MOV     BX,AX
1412:0226 8A07          MOV     AL,[BX]
1412:0228 33C9          XOR     CX,CX
1412:022A 81C30010      ADD     BX,1000
1412:022E 81D10020      ADC     CX,2000
1412:0232 8EC1          MOV     ES,CX
1412:0234 26            ES:
1412:0235 8807          MOV     [BX],AL
1412:0237 5D            POP     BP
1412:0238 C3            RET

做完1,简单理解了C语言是通过怎么样对内存进行访问

(2)编写一个程序,用一条C语句实现在屏幕的中间显示一个绿色的字符“a”.
main()
{
 *(int far *)0xb8780050=0x0261;
}
就是向显存中写入“a”

(3)分析下面程序中所有函数的汇编代码,思考相关的问题。
int a1,a2,a3;
void f(void);
main()
{
 int b1,b2,b3;
 a1=0xa1;a2=0xa2;a3=0xa3;
 b1=0xb1;b2=0xb2;b3=0xb3;
 printf("%x\n",main);
}
void f(void)
{
 int c1,c2,c3;
 a1=0x0fa1;a2=0xfa2;a3=0x0fa3;
 c1=0xc1;c2=0xc2;c3=0xc3;
}
汇编代码如下:
1412:01FA 55            PUSH    BP
1412:01FB 8BEC          MOV     BP,SP
1412:01FD 83EC06        SUB     SP,+06
1412:0200 C7062604A100  MOV     WORD PTR [0426],00A1
1412:0206 C7062804A200  MOV     WORD PTR [0428],00A2
1412:020C C7062A04A300  MOV     WORD PTR [042A],00A3
1412:0212 C746FAB100    MOV     WORD PTR [BP-06],00B1
1412:0217 C746FCB200    MOV     WORD PTR [BP-04],00B2
1412:021C C746FEB300    MOV     WORD PTR [BP-02],00B3
1412:0221 B8FA01        MOV     AX,01FA 
1412:0224 50            PUSH    AX         ;main地址入栈
1412:0225 B89401        MOV     AX,0194
1412:0228 50            PUSH    AX
1412:0229 E8E508        CALL    0B11
1412:022C 59            POP     CX
1412:022D 59            POP     CX
1412:022E 8BE5          MOV     SP,BP
1412:0230 5D            POP     BP
1412:0231 C3            RET
问题:C语言将全局变量存放在哪里?将局部变量存放在哪里?每个函数开关的“push bp mov bp,sp”有何含义?
分析:按照上面的汇编代码,C语言将全局变量存放在一段固定的内存空间中,将局部变量存放在栈中!每个函数开头的"push bp mov pop,sp"是将bp指向栈段,用于对数据的操作!

(4)分析下面程序的汇编代码,思考相关的问题。
int f(void);
int a,b,ab;
main()
{
 int c;
 c=f();
}
int f(void)
{
 ab=a+b;
 return ab;
}
汇编代码:
1412:01FA 55            PUSH    BP
1412:01FB 8BEC          MOV     BP,SP
1412:01FD 83EC02        SUB     SP,+02
1412:0200 E80700        CALL    020A
1412:0203 8946FE        MOV     [BP-02],AX
1412:0206 8BE5          MOV     SP,BP
1412:0208 5D            POP     BP
1412:0209 C3            RET
1412:020A 55            PUSH    BP
1412:020B 8BEC          MOV     BP,SP
1412:020D A1A601        MOV     AX,[01A6]
1412:0210 0306A801      ADD     AX,[01A8]
1412:0214 A3AA01        MOV     [01AA],AX
1412:0217 A1AA01        MOV     AX,[01AA]
1412:021A EB00          JMP     021C
1412:021C 5D            POP     BP
1412:021D C3            RET
问题:C语言将函数的返回值存放在哪里?
分析:一步步跟踪下来,返回值应该放在AX中!

(5)下面的程序向安全的内存空间写入从"a"到"h"的8个字符,理解程序的含义,深入理解相关的知识。
#define Buffer ((char *)*(int far *)0x02000000)
main()
{
 Buffer=(char *)malloc(20);
 Buffer[10]=0;
 while(Buffer[10]!=8)
 {
  Buffer[Buffer[10]]='a'+Buffer[10];
  Buffer[10]++;
 }
}

通过思考,还有Debug对这程序的跟踪,给我的收获就是C语言是怎么使用变量的,和怎么样使用内存空间对变量进行操作!
评论次数(2)  |  浏览次数(1407)  |  类型(汇编作业) |  收藏此文  | 

[  crazyman   发表于  2009-04-24 16:14  ]

对于最后一个题目(5),博主能分析一下,最终那8个字符写入了那段内存空间呢?这样才能知道博主是不是理解透了这个题目。

[  aten   发表于  2009-04-24 18:33  ]

恩,对于(5),通过Debug,整个过程基本上都了解了!
我是这样思考的,我将Buffer[10]当成了一个变量去理解!猜想C是不是这样使用变量的!因为刚学习C,好多知识还不理解!呵呵!

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码