zoukankan      html  css  js  c++  java
  • 2 汇编寄存器

    2.1 物理地址

    • 地址加法器采用物理地址 = 段地址(SA) * 16 + 偏移地址(EA) 的方法合成。

      • 基础地址 == 段地址 * 16 == 段地址左移1位 == 段地址后面加一位0;

      • 基础地址一定是16的倍数,偏移地址的寻址范围为0~FFFFH,寻址能力为64KB(16位CPU,2 ^ 16 = 64),所以一个段的最大长度为64KB。

    • CPU可以用不同的段地址和偏移地址形成同一个物理地址。

    2.2 汇编指令

    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.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.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.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.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.2.6 伪指令
    DW              ;定义字(2字节)
    PROC            ;定义过程
    ENDP            ;过程结束
    SEGMENT         ;定义段
    ASSUME          ;建立段寄存器寻址
    ENDS            ;段结束
    END             ;程序结束
    

    2.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位寄存器中。

    2.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指向的内存单元中的内容为指令。

    2.5 指令指针寄存器

    • IP:指令指针寄存器;

    2.6 标志寄存器

    • Flags:标志位寄存器;

    2.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
      

    2.8 指针寄存器

    • SP(Stack Pointer):存放栈的偏移地址的寄存器;

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

    2.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

  • 相关阅读:
    CMake 用法导览
    Irrlicht 1.8.4 + Win7 + VC2015 + x64 +OpenGL编译
    VirtualBox 5.1.14 获取VirtualBox COM对象错误
    CGAL Manual/tutorial_hello_world.html
    CGAL 介绍
    Open CASCADE 基础类(Foundation Classes)
    OpenCASCADE 基础
    Nginx 反向代理详解
    修改docker容器中的hosts文件
    Jmeter 设置连接oracle数据库
  • 原文地址:https://www.cnblogs.com/chungeyuan/p/11427176.html
Copyright © 2011-2022 走看看