研究试验3 使用内存空间
两个信息
1、指明是存储空间所在、是哪个信息;
2、指明存储空间有多大的类型信息;
对于寄存器来说,就需要给出寄存器的名词,寄存器的名词中也包含了它们的类型信息;
对于内存空间来说,就需要给出地址(准确地说,是内存空间首地址)和空间存储数据的类型
C语言用指针型数据来表示内存空间的地址和空间存储数据的类型
*(char *)0x2000 = 'a';
向偏移地址为2000H,存储一个字节的内存空间写入一个字符'a'
第一个 * ,表示要访问的是一个内存空间;
(char *)里面的 *,指明了这个数值表示一个内存空间的地址;
char 指明了这个地址是存储 char型数据的内存空间地址
(即一个内存空间存储一个char型、一个字节)
*(char far *) 0x20000000 = 'a'
*(char far *) 0x20000000 = 'a'
向地址为2000:0 、存储一个字节的内存空间写入字符'a'
far 指明内存空间的地址是段地址和偏移地址;
0x20000000 中的 0x2000 是段地址、0000是偏移地址;
(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;
}
um1.c 单步调试查看内存单元内容 注意CS :2000 与 2000:1000 的地址区别.png
(2)用一条C语言实现在屏幕中间显示一个绿色的字符‘a'
main()
{
printf("%x\n",main);
*(int far *)0xB80007D0 = 0x0261;
}
用一条C语句实现在屏幕中间显示一个绿色的字符'a'.png
mov ax,0B800H
mov es,ax
mov di,160*12+20*2 ; 2000D = 07D0H
mov byte ptr es:[di], 'a' ; 字符小a的ASCII码是61H
mov al,02H
mov es:[di+1],al ;设置属性为绿色
; 这样就完成在显存 B800:07D0H 处写入一个字符,并且设置字符颜色属性为绿色
; 也可以合着一条汇编指令来写
mov word ptr es:[di], 0261H
(3)C语言将全局变量放在某段内存,将局部变量放在栈空间,用mov bp,sp保存进入函数时的sp值
int a1,a2,a3;
void f(void);
main()
{
int b1,b2,b3;
a1 = 0xa1; a2 = 0xa2; a3 = 0xa3;
b1 = 0xb1; b2 = 0xb2; b3 = 0xb3;
}
void f(void)
{
int c1,c2,c3;
a1 = 0x0fa1; a2 = 0x0fa2; a3 = 0x0fa3;
c1 = 0xc1; c2 = 0xc2; c3 = 0xc3;
}
全局变量放在内存某段空间 局部变量放在栈里.PNG
push bp 保存bp内容用于子程序调用的返回 mov bp sp 是保存栈底地址到bp.png
函数中的就局部变量存在栈里面 函数结束 子程序调用返回 mov sp,bp 相当于使栈空间再次可用.png
(4)C语言将函数的返回值存在寄存器AX中(返回值类型是int)
int f(void);
int a,b,ab;
main()
{
int c;
c = f();
}
int f(void)
{
ab = a + b;
return ab;
}
函数返回值类型是int 返回值放在寄存器AX中.png
(4)向安全的内存空间写入“a”到“h”的8个字符
#define Buffer ((char *)*(int far*)0x200)
main()
{
Buffer = (char *)malloc(20);
Buffer[10] = 0;
while(Buffer[10]!=8)
{
Buffer[Buffer[10]] = 'a' + Buffer[10];
Buffer[10]++;
}
free(Buffer);
}
- define ? malloc ? 还没太弄明白。