汇编常用寄存器

本文索引

      • 一、数据寄存器(AX、BX、CX、DX寄存器)
      • 二、变址寄存器(SI寄存器、DI寄存器)
      • 三、指针寄存器(BP寄存器、SP寄存器)
      • 四、段寄存器(DS寄存器、ES寄存器)


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

你可能感兴趣的:(linux内核,汇编,linux启动)