没有合适的资源?快使用搜索试试~ 我知道了~
20160712_试验五V5.0_13邵温财1
需积分: 0 0 下载量 180 浏览量
2022-08-08
18:09:50
上传
评论
收藏 118KB DOCX 举报
温馨提示
试读
11页
20160712_试验五V5.0_13邵温财1
资源详情
资源评论
资源推荐
程序 a1.c
char ch; //定义 char 型变量
char *p; //定义 char 型指针变量,指针变量是专门用来存放地址的。
char **pa;
char far *pf;
int n; //定义 int 型变量
main()
{
p=(unsigned char *)0x1000;
/* mov word ptr [01af],1000 在变量 p 的地址 01af 处存放 1000
且变量 p 是指针变量,存放的就是地址,即[01af]处存放偏移地址为 1000 的地
址。*/
ch=*(unsigned char *)0x1000+*p+*(unsigned char far *)0x200;
/*
1.(unsigned char *)0x1000 将 1000 定义为指针地址,且这个地址放的是无
符号 char 型数据,前面再加个* 就是指向 1000 这个地址内的数据即:mov
al,[1000]。
2. p 是指针变量,专放地址的变量,通过上条指令可得知 p 变量放的地址
为 1000,我们的汇编代码先把 1000 给 bx 即:mov bx,[01af] *p 就相当于[bx],
因为 p 内存放的地址也是放的是无符号 char 型数据,所以*(unsigned char
*)0x1000+*p 对应为 add al,[bx]
3. (unsigned char far *)0x200 far 表示这个 0x200 是由段地址和偏移
地址组成即地址为:0x0000 0200 此地址是存放无符号 char 型数据的内存空间
地址,前面加个*,即指向这个地址的内存空间的数据。xor bx,bx mov es,bx
这两条指令是对 es 赋值为 0,mov bx,0200 偏移地址赋值为 0200 三个数据相
加即:add al,es:[bx]。 对 ch 变量赋值 mov [01a8],al 变量 ch 地址为
01a8。
*/
p=&ch;
// 在 变 量 p 的 地 址 01af 处 存 放 ch 变 量 地 址 01a8 即 : mov word ptr
[01af],01a8
pa=&p;
/*
在 变 量 pa 的 地 址 01a6 处 存 放 p 变 量 地 址 01af 即 :mov word ptr
[01a6],01af 变量 pa 的偏移地址为 01a6。
*/
**pa=**pa+1;
/*
pa 变量存放 01af 地址,*pa 为指向 01af 的内存空间即:mov bx,[01a6] 对
应 bx=pa mov bx,[bx] 对应 bx=*pa,01af 内存空间存放地址 01a8,即**pa 为
指向 01a8 的内存空间。mov al,[bx]对应为 al= **pa inc al 对应为 al=al+1
**pa 对应汇编代码为: mov bx,[01a6] 、mov bx,[bx] 、[bx]
**pa=al 即:mov [bx],al。
*/
pf=(char far *)&ch;
/*
far 表示取 ch 变量的段地址和偏移地址,将 ch 变量的地址强制转换为 far
型。此地址处存放 char 型数据即:mov [01ad],ds mov word ptr [01ab],01a8。
即*pf 指向这个地址的内存空间,且这空间存放 char 型数据
*/
*pf=*pf+1;
/*
pf 里放的是 ch 变量段地址和偏移地址,*pf 指向 ch 段地址:偏移地址处的
内存空间。即指向 ch 变量内存空间。les bx,[01ab],取偏移地址给 bx,段地址
给 es。 mov al,es:[bx]将内存空间的数据放到 al 中, inc al 对应*pf+1 。*pf
对应汇编代码 les bx,[01ab]、es:[bx]
*pf=al 即:mov es:[bx],al
*/
n=(int)&ch;
/*
(int)&ch 前 面 的 (int) 是 指 将 ch 变 量 的 地 址 强 制 转 换 为 int 型 mov
ax,01a8 mov [01a9],ax 这就是为什么不直接用 mov word ptr[01a9],01a8 的
原因。n 变量地址为 01a9。
*(char *)n=*(char *)n+1;
/* n 变量放的是 ch 变量的地址,*(char *)n 指向 ch 变量空间的 char 型数据然
后将数据+1,最后赋值给指向的内存空间对应汇编代码为 mov bx,[01a9] mov
al,[bx] inc al mov bx,[01a9] mov [bx],al。
*/
}
优先级顺序:
赋值运算符优先级最低 = &= ~=
逻辑运算符次低 与或非
比较运算符
加减乘除
!++ -- & * ~
() -> 最高。
char *常量 即定义这个常量为地址 且这个地址放 char 型数据 *常量
char *变量 即定义这个变量为指针变量,这个变量专放地址 *变量
结论:指针基本上通过 bx 来进行寄存器间接寻址。
中间数据基本上存放在 al,或 ax 寄存器中。
最前面的*表示要访问的是一个内存空间
(*),括号里的*是指明后面跟的是内存地址。
定义时,类型后面的*表示定义指针变量。
探究:
对于*操作,上面可知**这种双重操作可以间接操作变量,是否可以定义多
层次的指针?
我写了这样的代码;
char *a;
char **b;
char ***c;
char d;
char ****e;
char *****f;
main()
{
d=1;
a=&d;
b=&a;
c=&b;
e=&c;
f=&e;
*****f=*****f+1;
printf("start d=1\n end d=");
printf("%d",d);
}
结果如下
操作成功,说明*操作很可能没有层数限制,但是为了便于理解,我不建议
这样使用。
而对于取地址符不能进行嵌套使用。
程序 b1.c
typedef struct
{
int number;
char c;
char name[8];
}stu;
stu a;
char *pchar; //指向 char 型的指针变量
int *pint; //指向 int 型的指针变量
stu *pstu; //指向结构体的指针变量
main()
{
剩余10页未读,继续阅读
金山文档
- 粉丝: 24
- 资源: 306
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0