汇编常用寄存器
汇编寄存器主要分两类,通用寄存器和特殊功能寄存器。
通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,保存运算结果。除此之外,它们还各自具有一些特殊功能。通用寄存器的长度取决于机器字长,汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途,只有这样,才能在程序中做到正确、合理地使用它们。16位cpu通用寄存器共有8个:AX、BX、CX、DX、BP、SP、SI、DI。32位cpu通用寄存器共有8个: EAX、EBX、ECX、EDX、EBP、ESP、ESI、EDI功能和16位CPU差不多。
一、数据寄存器(AX、BX、CX、DX寄存器)
AX、BX、CX、DX可以称作数据寄存器,这4个16位寄存器又可分别分成高8位(AH、BH、CH、DH)和低8位(AL、BL、CL、DL)。因此它们既可作为4个16位数据寄存器使用,也可作为8个8位数据寄存器使用。在编程时可存放源操作数、目的操作数或运算结果。数据寄存器是存放操作数、运算结果和运算的中间结果,以减少访问存储器的次数,或者存放从存储器读取的数据以及写入存储器的数据的寄存器。
- AX(accumulator)累加器。是算术运算的主要寄存器。在乘、除等指令中指定用来存放操作数,以及所有的 I/O指令都使用这一寄存器与外部设备传送信息。
- BX(base)基址寄存器。常做存放地址使用。
- CX(count)计数器。常用来保存计数值,如在循环、位移和串处理指令中作隐含计数器。
- DX(data)数据。一般在作双字长运算时把DX和AX组合在一起存放一个双字长数,DX用来存放高位数。对于某些I/O操作,DX可用来存放I/O的端口地址。
上述寄存器均可用作通用寄存器。
二、变址寄存器(SI寄存器、DI寄存器)
SI是源变址寄存器,DI是目的变址寄存器。一般用来存放地址偏移,也可以用来存放数据。但需要注意的是:在串处理指令中,SI用作隐含的源串地址,默认在DS中;DI用做隐含的目的串地址,默认在ES中;此时不能混用。
mov ax,1000H
mov ds,ax
mov si,2
mov ax,[si] ! ds:si = 1000H + 2
即把ds偏移2位置数据取出赋值给ax。
三、指针寄存器(BP寄存器、SP寄存器)
- SP(stack pointer)堆栈寄存器,SP寄存器存放栈的偏移地址。
- BP(base pointer)基数指针寄存器BP,它的用途有点特殊,需和堆栈指针SP联合使用的,作为SP校准使用的,只有在寻找堆栈里的数据和使用个别的寻址方式时候才能用到。比如说,堆栈中压入了很多数据或者地址,你肯定想通过SP来访问这些数据或者地址,但SP是要指向栈顶的,是不能随便乱改的,这时候你就需要使用BP,把SP的值传递给BP,通过BP来寻找堆栈里数据或者地址.
BP作为基址寄存器,一般在函数中用来保存进入函数时的SP的栈顶基址。
每次子函数调用时,系统在开始时都会保存这个两个指针并在函数结束时恢复SP和BP的值。
在函数进入时:
push bp !! 保存BP指针
mov bp,sp !! 将SP指针传给BP,此时BP指向SP的基地址。
!! 这个时候,如果该函数有参数,则[bp + 2*4]是该子函数的第一个参数;
!! [bp+3*4]是该子函数的第二个参数,以此类推,有多少个参数则[bp+(n-1)*4]。
.....
.....
函数结束时:
mov sp,bp !! 将原sp指针传回给sp
pop bp !! 恢复原bp的值。
ret !! 退出子函数
四、段寄存器(DS寄存器、ES寄存器)
DS(Data Segment)和 ES(Extra Segment)都属于段寄存器,用于存放的就是某个段地址。
下面看一个介绍使用 DS 寄存器的 Demo:
ASSUME CS:CODES
CODES SEGMENT
START:
MOV AX,1000H
MOV DS,AX
MOV AL,1
MOV BX,0
MOV CX,5 ;设计一个循环,让其循环 5 次
s: MOV [BX],AL ;这里 [BX] = (DS:BX)
INC AL
INC BX
LOOP s
MOV AH,4CH
INT 21H
CODES ENDS
END START
上面的代码所做的事情,就是通过循环将 1,2,3,4,5 写入到地址(1000H:0000H)、(1000H:0001H)、(1000H:0002H)、(1000H:0003H)、(1000H:0004H)。
注:CPU不支持直接将立即数送入段寄存器中,如下操作方式不合法:
MOV DS,1000H !! 非法操作