1、在debug 中对main函数进行单步跟踪:
进行如下设置将cs:ip指向main地址
>>a
15A3:0000 mov ax,15a3
15a3:0003 mov ds,ax
15a3:0005 call word ptr [9]
>>e
15a3:0009 30.fa CD.01
这是一种愚蠢的方法
很简单的:
call 01fa
g 01fa
(看来自己相关的知识有问题哦)
2、show程序如下:
main()
{
*(char far *)(0xb8000000+160*12+40*2)='a';
}
3、根据汇编代码观察有:
C语言中将全局变量存放在01A6,01A8,01AA内存单元中。
问题,是不是所有的C语言程序的全局变量都都在01A6开始的内存单元中?
局部变量存放在栈中,所以每个函数的开头的
push bp
mob bp,sp
就是用来保存原先栈顶指针的!
4、C程序
int f(void);
int a,b,ab;
main() push bp
{ mov bp,sp
int c; sub sp,2
c=f(); call 020a
}
int f(void) push bp
{ mov bp,sp
ab=a+b; mov ax,[01a6] add ax,[01a8]
return ab; mov [01aa],ax
mov ax,[01aa]
}
思考:①C语言将函数的返回值放在AX中
②全局变量a,b ,ab也是放在向系统申请的数据段ds:01a6
ds:01a8,ds:01aa
③局部变量放在向系统申请的栈段中
④一个变量(不是什么类型的变量)代表一个内存单元!
5、程序理解
#define Buffer((char*)*(int far *)0x02000000)
Buffer为字符型指针指向内存单元0200:0000
Buffer=(char *)malloc (20)
在汇编程序中call 04DD完成malloc功能,返回指针即内存单元放在AX中,这种分配是动态的体现在,每次执行call 04DD后AX的值是不同的。mov bx,0200 mov es,bx xor bx,bx mov es:[bx],ax将Buffer指向动态分配的内存单元。
- [游客] 接下来的呢? 07/06 18:01
- [游客] 这个简单。 07/05 18:56
- [游客] 分析的不错,得出的结论也正确,这下子就理解清楚了。 12/18 22:09
- [yugong] 一定要把它搞定!!! 12/11 22:11
- [游客] 再把研究好好研究研究,一定能做出来。 12/11 21:52
- [yugong] younggay,你知道上面3中那个问题吗? 12/10 16:52
- [younggay] 嗯。不错。 12/09 22:09
- [younggay] 大歌们谁能告诉我汇编屏幕分辨率80*25和字体用彩色 -------------- 自己按照《汇 12/09 22:06
- [游客] 用汇编剖析C语言,确实很牛很强大。 12/09 10:24
- [zrwxj3581] 大歌们谁能告诉我汇编屏幕分辨率80*25和字体用彩色 12/09 09:37
- [jcw2008] 元旦快乐! 12/31 23:58
- [jcw2008] Merry Christmas! 12/25 01:17
- [yugong] 字体用彩色请参考实验9的资料! 12/09 20:31
- [zrwxj3581] 大歌们谁能告诉我汇编屏幕分辨率80*25和字体用彩色 12/09 09:35