汇编笔记_寄存器

1 物理地址

  • 地址加法器采用物理地址 = 段地址(SA) * 16 + 偏移地址(EA) 的方法合成。
    • 基础地址 == 段地址 * 16 == 段地址左移1位 == 段地址后面加一位0;
    • 基础地址一定是16的倍数,偏移地址的寻址范围为0~FFFFH,寻址能力为64KB(16位CPU,2 ^ 16 = 64),所以一个段的最大长度为64KB。
  • CPU可以用不同的段地址和偏移地址形成同一个物理地址。

2 汇编指令

2.1 通用数据传送指令

  • 汇编指令及寄存器名称不区分大小写。
  • 一个8位二进制位只能存放两位十六制位,1111 1111 = FF
  • 操作对象位数不一致,两者之间不能相互操作。如add ax, bh;(err)
1、数据传输指令
MOV             ;传送字或字节
MOVSX           ;先符号扩展,再传送
MOVZX           ;先零扩展,再传送
PUSH            ;把字压入堆栈
POP             ;把字弹出堆栈
PUSHA           ;把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈
POPA            ;把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈
PUSHAD          ;把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈
POPAD           ;把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈
BSWAP           ;交换32位寄存器里字节的顺序
XCHG            ;交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
CMPXCHG         ;比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )
XADD            ;先交换再累加.( 结果在第一个操作数里 )
XLAT            ;字节查表转换
                        ;── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即
                        ;0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )
               
2、输入输出端口传送指令
IN              ;I/O端口输入( 语法: IN 累加器, {端口号│DX} ) 
OUT             ;I/O端口输出( 语法: OUT {端口号│DX},累加器 ) 
                ;输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时, 其范围是 0-65535
        
3、目的地址传送指令
LEA             ;装入有效地址.    例: LEA DX,string  ;把偏移地址存到DX. 
LDS             ;传送目标指针,把指针内容装入DS.  例: LDS SI,string  ;把段地址:偏移地址存到DS:SI. 
LES             ;传送目标指针,把指针内容装入ES.  例: LES DI,string  ;把段地址:偏移地址存到ES:DI. 
LFS             ;传送目标指针,把指针内容装入FS.  例: LFS DI,string  ;把段地址:偏移地址存到FS:DI. 
LGS             ;传送目标指针,把指针内容装入GS.  例: LGS DI,string  ;把段地址:偏移地址存到GS:DI. 
LSS             ;传送目标指针,把指针内容装入SS.  例: LSS DI,string  ;把段地址:偏移地址存到SS:DI. 

4、标志传送指令. 
LAHF            ;标志寄存器传送,把标志装入AH. 
SAHF            ;标志寄存器传送,把AH内容装入标志寄存器. 
PUSHF           ;标志入栈. 
POPF            ;标志出栈. 
PUSHD           ;32位标志入栈. 
POPD            ;32位标志出栈. 

2.2 算术运算指令

ADD            ;加法,等价于ax += bx
ADC            ;带进位加法
INC            ;加 1
AAA            ;加法的ASCII码调整
DAA            ;加法的十进制调整
SUB            ;减法
SBB            ;带借位减法
DEC            ;减 1
NEC            ;求反(以 0 减之)
CMP            ;比较.(两操作数作减法,仅修改标志位,不回送结果)
AAS            ;减法的ASCII码调整
DAS            ;减法的十进制调整

MUL            ;无符号乘法
IMUL           ;整数乘法
                    ;以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算)
       
AAM            ;乘法的ASCII码调整

DIV            ;无符号除法
IDIV           ;整数除法
                    ;以上两条,结果回送: 
                                ;商回送AL,余数回送AH, (字节运算);
                                ;或  商回送AX,余数回送DX, (字运算).
AAD            ;除法的ASCII码调整
CBW            ;字节转换为字(把AL中字节的符号扩展到AH中去) 
CWD            ;字转换为双字(把AX中的字的符号扩展到DX中去) 
CWDE           ;字转换为双字(把AX中的字符号扩展到EAX中去) 
CDQ            ;双字扩展(把EAX中的字的符号扩展到EDX中去) 

2.3 程序转移指令

  • 能够改变CS、IP内容的指令被统称为程序转移指令。
1、无条件转移指令 (长转移) 
JMP             ;无条件转移指令
                ;jmp 2AE3:3;    等价于 mov CS, 2AE3    mov IP, 3;
                ;jmp ax;        等价于 mov IP, ax;
CALL            ;过程调用
RET/RETF        ;过程返回

2、条件转移指令 (短转移,-128到+127的距离内) 
    ( 当且仅当(SF XOR OF)=1时,OP1<OP2 ) 
JA/JNBE         ;不小于或不等于时转移
JAE/JNB         ;大于或等于转移
JB/JNAE         ;小于转移
JBE/JNA         ;小于或等于转移
                ;以上四条,测试无符号整数运算的结果(标志C和Z)

JG/JNLE         ;大于转移
JGE/JNL         ;大于或等于转移
JL/JNGE         ;小于转移
JLE/JNG         ;小于或等于转移
                ;以上四条,测试带符号整数运算的结果(标志S,O和Z)

JE/JZ           ;等于转移
JNE/JNZ         ;不等于时转移
JC              ;有进位时转移
JNC             ;无进位时转移
JNO             ;不溢出时转移
JNP/JPO         ;奇偶性为奇数时转移
JNS             ;符号位为 "0" 时转移
JO              ;溢出转移
JP/JPE          ;奇偶性为偶数时转移
JS              ;符号位为 "1" 时转移

3、循环控制指令(短转移)
LOOP            ;CX不为零时循环
LOOPE/LOOPZ     ;CX不为零且标志Z=1时循环
LOOPNE/LOOPNZ   ;CX不为零且标志Z=0时循环
JCXZ            ;CX为零时转移
JECXZ           ;ECX为零时转移

4、中断指令
INT             ;中断指令
INTO            ;溢出中断
IRET            ;中断返回

5、处理器控制指令
HLT             ;处理器暂停, 直到出现中断或复位信号才继续
WAIT            ;当芯片引线TEST为高电平时使CPU进入等待状态
ESC             ;转换到外处理器
LOCK            ;封锁总线
NOP             ;空操作
STC             ;置进位标志位
CLC             ;清进位标志位
CMC             ;进位标志取反
STD             ;置方向标志位
CLD             ;清方向标志位
STI             ;置中断允许位
CLI             ;清中断允许位

2.4 逻辑运算指令

AND            ;与运算. 
OR             ;或运算. 
XOR            ;异或运算. 
NOT            ;取反. 
TEST           ;测试.(两操作数作与运算,仅修改标志位,不回送结果). 

SHL            ;逻辑左移. 
SAL            ;算术左移.(=SHL) 
SHR            ;逻辑右移. 
SAR            ;算术右移.(=SHR) 
ROL            ;循环左移. 
ROR            ;循环右移. 
RCL            ;通过进位的循环左移. 
RCR            ;通过进位的循环右移. 
               ;以上八种移位指令,其移位次数可达255次. 
                   ;移位一次时, 可直接用操作码.  如 SHL AX,1. 
                   ;移位>1次时, 则由寄存器CL给出移位次数. 
                       ;如  MOV CL,04 
                       ;SHL AX,CL 

2.5 串指令

DS:SI          ;源串段寄存器  :源串变址. 
ES:DI          ;目标串段寄存器:目标串变址. 
CX             ;重复次数计数器. 
AL/AX          ;扫描值
D标志           ;0表示重复操作中SI和DI应自动增量; 1表示应自动减量
Z标志           ;用来控制扫描或比较操作的结束
MOVS           ;串传送
               ;(MOVSB 传送字符, MOVSW 传送字, MOVSD 传送双字) 
CMPS           ;串比较. 
               ;(CMPSB 比较字符, CMPSW 比较字) 
SCAS           ;串扫描,把AL或AX的内容与目标串作比较,比较结果反映在标志位. 
LODS           ;装入串,把源串中的元素(字或字节)逐一装入AL或AX中
               ;(LODSB 传送字符, LODSW 传送字, LODSD 传送双字) 
STOS           ;保存串,是LODS的逆过程
REP            ;当CX/ECX<>0时重复
REPE/REPZ      ;当ZF=1或比较结果相等,且CX/ECX<>0时重复
REPNE/REPNZ    ;当ZF=0或比较结果不相等,且CX/ECX<>0时重复
REPC           ;当CF=1且CX/ECX<>0时重复
REPNC          ;当CF=0且CX/ECX<>0时重复

2.6 伪指令

DW              ;定义字(2字节)
PROC            ;定义过程
ENDP            ;过程结束
SEGMENT         ;定义段
ASSUME          ;建立段寄存器寻址
ENDS            ;段结束
END             ;程序结束

3 普通数据寄存器

  • 16位寄存器-->AX;32位寄存器-->EAX;64位寄存器-->RAX;
  • 通用寄存器:通常用来存放一般性的数据,有AX、BX、CX、DX等4个。
  • 8086CPU中
    • AX可分为AH和AL;(累加寄存器Accumulator:可用于乘、除、输入、输出等、中间结果缓存操作等。)
    • BX可分为BH和BL;(基地址寄存器Base:可作为存储器指针来使用。)
    • CX可分为CH和CL;(计数寄存器Count:在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数。)
    • DX可分为DH和DL;(数据寄存器Data:在进行乘除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。)
    • 如AX:AX的低8位(0位~7位)构成了AL寄存器,高8位(8位~15位)构成了AH寄存器。AH和AL寄存器是两个可以独立使用的8位寄存器。
    • 除数据寄存器可以分为两个独立的8位寄存器外,其余均不可分。
  • 一个字由两个字节组成,即一个字可以存在一个16位寄存器中。

4 段寄存器

1 数据不能直接送入到段寄存器中,需要普通寄存器中转;
2 字在内存中存储时,要用两个连续的内存单元来存放;
3 高地址存放高字节,低地址存放低字节。

  • CS(Code Segment):代码段寄存器,指明代码的起始地址;

    • 利用CS:IP取得下一条要执行的指令。
  • DS(Data Segment):数据段寄存器,指明数据的起始地址;

    • 利用DS:EA存取数据段中的数据。

    • EA为偏移地址,即有效地址。

      ; 如果没有指定前缀,一般的数据访问在DS(数据)段
      mov ax,[1000];  =  mov ax,ds:[1000h]
      mov ax,cs:[1000];   从指定的CS段取出数据。
          [1000]  ;代表内存中的数据,1000表示内存单元的偏移地址。

  • SS(Stack Segment):栈段寄存器,指明栈的起始地址(段地址);

    • 利用SS:SP操作栈顶数据。
  • ES(Extra Segment):附加段寄存器,指明附加段的起始地址;

    • 利用ES:EA存取附加段中的数据。
  • FS:附加段寄存器。

  • GS:附加段寄存器。

  • CPU只认被CS:IP指向的内存单元中的内容为指令。

5 指令指针寄存器

  • IP:指令指针寄存器;

6 标志寄存器

  • Flags:标志位寄存器;

7 编址寄存器

  • SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针,在串处理指令中,SI用作隐含的源串地址,默认在DS中。

  • DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针,在串处理指令中,DI用做隐含的目的串地址,默认在ES中。

    ; 将字符串"welcome to masm!" 复制到后面的数据区中
    assume cs:codesg, ds:datasg
    datasg segment
      db 'welcome to masm!'
      db '…………………………………………'
    datasg ends
    codesg segment
    start: mov ax, datasg
         mov ds, ax
         mov si, 0    ;源变址
         mov di, 16   ;目的变址,"welcome to masm!"占16个字节
         mov cx, 8    ;si,di为16位寄存器,每次2个字节,共需8次
      s: mov ax, [si]
         mov [di], ax
         add si, 2
         add di, 2
         loop s
         mov ax, 4c00h
         int 21h
    codesg ends
    end start

8 指针寄存器

  • SP(Stack Pointer):存放栈的偏移地址的寄存器;
  • BP(Base Pointer):基数指针寄存器,用以确定在堆栈中的操作数地址;

9 Debug使用

  • R:查看、更改CPU寄存器内容;

    r # 查看
    r ax  # 把ax修改为1100
    :1100
  • D:查看内存中的内容;

    d 段地址/寄存器:偏移地址        # d 500:100
    d 段地址/寄存器:偏移地址 结束偏移地址     # d 500:100 109

    • 左边是每行的起始地址。
    • 右边是每个内存单元中的数据对应的可显示的ASCⅡ码字符。
    • 中间是从指定地址开始的128个内存单元的内容,用十六进制的格式输出,每行的输出从16的整数倍的地址开始,最多输出16个单元的内容。
  • E:改写内存中的内容;

    e 段地址/寄存器:偏移地址 数据/字符/字符串/机器码 ……
    e 段地址/寄存器:偏移地址

  • U:将内存中的机器指令翻译成汇编指令;

    # 查看指定的内存单元中的机器指令和它们所对应的汇编指令。
    u 段地址/寄存器:偏移地址
  • T:执行一条机器指令;

    • 执行CS:IP处的指令。
  • A:以汇编指令的格式在内存中写入一条机器指令。

    • 以汇编指令的形式在内存中写入机器指令。

      a 段地址/寄存器:偏移地址
  • P:自动重复执行循环中的指令,直到循环条件不满足;

  • G:g 0016,自动执行到CS:16处;

说明:汇编指令部分摘自:https://www.kanxue.com/chm.htm?id=10101&pid=node1001139

猜你喜欢

转载自www.cnblogs.com/chungeyuan/p/11427176.html