寄存器(访问内存)
内存的存储单位也是字节,所以一个寄存器可以存储一个子单元即两个内存单元的信息。先介绍一下数据寄存器DS,数据寄存器是用来存放访问数据的段地址:例如以下代码->mov bx,1000h ;mov ds,bx; mov al,[0];可以解释为,将地址10000h字节单元中的信息存放到al中去。此处应该注意,[ ]表示内存地址,里边可以是数字,运算式也可以是通用寄存器(当然通用寄存器里边存放的也是数据才行)
进行字传送的时候也可以用低字节地址来代表整个字的地址(此时类似C语言中的字符串或者数组。。。。)例如以下代码 mov ax,[0];代表把[0],[1]两个字节同时送入ax中去当然0地址内容送到al中去,【1】内容送到ah中去,这里边的低字节高字节对应关系就是这样。此原理同样适用于其他寄存器。
简单介绍几条汇编语言指令:
mov---数据传送指令操作数可以是寄存器,内存单元例如 mov ax,ax mov ax, [0] mov ax ,[ax]当然立即数也是可以的 mov ax,3H 也是对的。。mov就是讲目的操作数传送到原操作数的存储单位中。
add---就是加法指令,将目的操作数加到原操作数上例如, mov ax, 0 ; mov ax, 1; 指令执行完毕后ax=1,
关于栈-----这是一个很重要的概念
栈就像是一个盒子---用来存放信息,对于栈有两个基本的操作----入栈,和出栈。入栈就是将信息放入栈顶,出栈就是将栈顶的信息进行输出,所以从程序化的角度讲,会有一个标记,这个标记一直指向栈顶,呵呵(栈就像是一个没有顶盖的盒子信息的存储只能从盒子上部--栈顶 而不能从底部或者中间)这就是所说的LIFO(last in first out后进先出)原则
cpu的栈机制
如今的cpu都提供了栈机制,所以我们编程的时候可以把一段内存当成栈来使用。在汇编语言中就有入栈出栈操作指令。 push pop操作指令。注意这两个指令都是16位操作指令,不能进行单一字节操作。例如push ax 是对的但是push al就错了。。另外这两个指令都是单一操作数指令,说到堆栈不得不提到堆栈指针寄存器和堆栈段寄存器了sp ss关于指令push ax 的解释---ss是指向当前的堆栈段段地址,sp是当前堆栈段偏移地址,关于push ax 的执行操作1 sp=sp-2 2将ax的内容传送到ss:sp指向的存储单元中,而pop ax 解释为 sp=sp+2 将ss:sp指向的存储单元信息传送到ax中去。。。。。。从这两个汇编语句我们可以了解到push pop指令的操作数就是16位 因为每次操作 sp移动的单位都是2.。。。另外ss:sp指向的地址总是栈的栈顶,这就是为什么进栈出栈都是遵循LIFO晕原则。
栈的应用注意
程序中应用的栈基本上都是我们自己定义的,所以每个栈都有自己的存储范围,一旦出现栈顶超界问题将会非常麻烦。因为一旦超界,那么我们传送的数据就会覆盖栈外边的数据,这外边的数据可能是系统程序占用单元,一旦改写就造成意想不到的问题。所以我们编程时要特别注意控制栈的大小和栈顶的指向,当然我们也不能把栈设置的无限大,毕竟系统资源也是有限的。
pop 和push的用法
基本的意思我们已经了解但是他们具体的操作数格式还需进一步的解释 他们的操作数可以是 寄存器 内存单元例如 push ax push [1] 但是一定注意操作数必然是16位的。。呵呵第三章的讲解完毕,有什么不足和错误之处敬请斧正。。。
http://www.sela365.com/invite.php?u=23&c=91d8d8bc444点击打开链接