(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语言是怎么使用变量的,和怎么样使用内存空间对变量进行操作!
- [游客] 飘过 06/11 13:31
- [fpamc] 貌似我正在步入你的路线……`(*∩_∩*)′Up!Up! 05/24 07:46
- [782936509] 敢问高手你是什么基础开始学的,我没有基础想学编程可以的吗?很想成为一个编程员,希望多多指教,呵呵 12/24 19:26
- [aten] 上面的程序我忘记设置要写入的扇区数了,……-_-~! 08/07 15:50
- [keyia] 啊,如梦初醒!万分感谢 05/28 01:32
- [aten] 好久没来汇编网了,拿你调试的结果来说吧! F:\dosimg\>debug c0s.exe - 05/26 22:52
- [keyia] keyia:变成游客了 05/22 19:42
- [游客] 向您请教: (8)从上我们可以看出tc.exe把c0s.obj和用户obj文件一同进行连接,生成e 05/22 19:40
- [aten] dw 定义的应该是10个字单元,我写成了8个了!所以答案就成了20H 04/26 22:01
- [aten] 恩,^_^ 04/24 18:36
- [游客] 这个,你的那个安装INT9中断程序的程序有一点错误,以下这个是我改正后的: assume cs:c 10/08 07:28
- [游客] 没想到我想走的路和正在走的路你已经走过一遍了,可以的话请加865650570——凌陶 愿我们在同一 10/07 23:30
- [keyia] 向您请教: (8)从上我们可以看出tc.exe把c0s.obj和用户obj文件一同进行连接,生成 05/22 19:44