汇编笔记二
内存访问
关于计算机内存访问,不能不说到计算机的内存分段,分页(学了操作系统的小伙伴应该都知道)。计算机的内存寻址和访问都要通过段表和页表的转换,将逻辑地址转换成物理地址,再进行磁盘读写,它的一个重要的转换原则就是“段基址*16+偏移地址=目的地址”。
在计算机中,内存被分为四个区,代码区,数据区,堆区,栈区。各自的作用就不细说。在汇编语言中,区又可以被称为段,前面讲寄存器的时候讲到了它有段寄存器,它用于段基址的存储,指针寄存器则用于偏移地址的存储,计算机利用上面的转换原则和两类寄存器对内存进行访问。
#小例子,汇编语言的内存访问
mov ax,0000;
mov ds,ax;
mov [1],ax;
#表示将ds(内存基址)设置为0000,并将0000送到0000:1-0000:2处,ax为16位寄存器,而一个内存单元为1byte(8位)
#[adderss]表示以ds为段基址,第address个内存单元的位置
字和字节
在计算机中,数据的大小用字(word)和字节(byte )来表示,分别表示16位(在16位环境下)和8位数据,在汇编语言定义数据时,通常用db,dw,dd来分别表示定义了8位,16位,32位的数据。
代码段
对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。我们可以将长度为N(N≤64KB)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中,我们可以认为,这段内存是用来存放代码的,从而定义了一个代码段。
比如下例:
mov ax,0000
add ax,0123H
mov bx,ax
jmp bx
这样就定义了一个代码段。
cs:ip即刚刚说的段基址:偏移地址的内存访问方法。
栈段
栈是一种广泛应用的数据结构
栈段的基址寄存器是ss寄存器,指针寄存器是sp。
通常用的指令有pop和push,分别代表出栈和入栈。
#小例子,对栈里的数据进行操作
mov ax,1000H
mov ss,ax #设置栈段地址,它不能直接传入数据,所以用ax寄存器做中转
mov sp,0010H #设置栈顶的偏移地址,在栈为空时,栈指针指向栈底下一个内存单元
#下面这一段程序实现ax寄存器和bx寄存器内容的交换
push ax #压入ax
push bx #压入bx
pop ax #弹出栈顶,即bx的数据到ax中
pop bx #同上
小结
计算机通过一系列相关的机制来进行对内存的访问,让我们稍稍理解了计算机的基操原理(读写访问)。汇编语言相比以往的高级语言带给我们的是更接近底层的编程体验,能直接对机器进行操作(真正cpu运行还是要编译成二进制代码,这里只是说能操纵寄存器等底层物件)。