欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

汇编常用寄存器

程序员文章站 2024-02-01 18:43:58
...


        汇编寄存器主要分两类,通用寄存器特殊功能寄存器
        通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,保存运算结果。除此之外,它们还各自具有一些特殊功能。通用寄存器的长度取决于机器字长,汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途,只有这样,才能在程序中做到正确、合理地使用它们。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			!! 非法操作