NASM汇编指令复习

来源:互联网 发布:淘宝客订单虚假交易 编辑:程序博客网 时间:2024/04/28 02:50

1. cli 在asm汇编中表示将处理器标志寄存器的中断标志位清0,不允许中断

 

2. 汇编 eax寄存器和AX,AH,AL之间的关系
 00000000 00000000 00000000 00000000
 |===============EAX===============|--32个0,4个字节,2个字,1个双字
                                        |======AX=======|--16个0,2个字节,1个字
                                        |==AH===| --------------8个0,1个字节
                                                         |===AL==|---8个0,1个字节
   AH是AX的高8位,AL是AX的低8位,AX是EAX的低16位

 

3. in al,92h 表示从92h号端口读入一个字节
    out 92h,al 表示向92h号端口写入一个字节

 

4.控制寄存器(CR0~CR3) 
     用于控制和确定处理器的操作模式以及当前执行任务的特性,CR0中含有控制处理器操作模式和状态的系统控制标志;CR1保留不用;CR2含有导致页错误的 线性地址;CR3中含有页目录表物理内存基地址,因此该寄存器也被称为页目录基地址寄存器PDBR(Page-Directory Base address Register)。
CR0中保护控制位:
(1)PE:CR0的位0是启用保护(Protection Enable)标志。当设置该位时即开启了保护模式;当复位时即进入实地址模式。
(2)PG:CR0的位31是分页(Paging)标志。当设置该位时即开启了分页机制;当复位时则禁止分页机制,此时所有线性地址等同于物理地址。
(3)WP:对于Intel 80486或以上的CPU,CR0的位16是写保护(Write Proctect)标志。当设置该标志时,处理器会禁止超级用户程序(例如特权级0的程序)向用户级只读页面执行写操作;当该位复位时则反之。
(4)NE:对于Intel 80486或以上的CPU,CR0的位5是协处理器错误(Numeric Error)标志。当设置该标志时,就启用了x87协处理器错误的内部报告机制;若复位该标志,那么就使用PC形式的x87协处理器错误报告机制。

 

5. NASM汇编程序中的宏定义

格式如下:
%macro 宏名 参数名列表   
   宏体
%endmacro

如:

%macro Descriptor 3
    dw    %2 & 0FFFFh                
    dw    %1 & 0FFFFh               
    db    (%1 >> 16) & 0FFh           
    dw    ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh)    
    db    (%1 >> 24) & 0FFh            
%endmacro ; 共 8 字节

这个宏定义了操作系统中描述符的格式,宏名为:Descriptor 。使用时只需定义:

Descriptor 参数1, 参数2, 参数3

即可。其中宏定义中的%1代表参数1,%2代表参数2,%3代表参数3

 

6. LODS/LODSB/LODSW/LODSD块装入指令

   将由源变址寄存器DS:E(SI)寻址的一个内存指向的存储器操作数OPS装入到累加器AL/AX/EAX中, 并根据DF之值自动修改地址【当方向标志位D=0时,则SI自动增加;D=1时,SI自动减小。】,为下次传送作准备.LODSB/LODSW /LODSD是不操作数的字符串装入指令.只是LODSB,LODSW,LODSD装入的分别是字节,字 ,双字.

 

7. test属于逻辑运算指令 

   功能: 执行BIT与BIT之间的逻辑运算  
   测试(两操作数作与运算,仅修改标志位,不回送结果).  
  Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。TEST AX,BX 与 AND AX,BX 命令有相同效果  
  Test的一个非常普遍的用法是用来测试一方寄存器是否为空:  
例如:
test ecx, ecx  
jz somewhere  
如果ecx为零,设置ZF零标志为1,Jz跳转

 

8. MOVZX是汇编语言数据传送指令MOV的变体。无符号扩展,并传送。

  movzx其实就是将我们的源操作数取出来,然后置于目的操作数,目的操作数其余位用0填充。
举个例子,例如
  令eax=00304000h
   若执行 movzx eax, ax后 eax = 00004000h 。
   若执行 movzx eax, ah后 eax = 00000030h。
  又如:
   MOV BL,80H   MOVZX AX,BL

 

9. 字符串处理指令stosb, stosw, stosd

  stosb, stosw, stosd这三个指令把al/ ax/ eax的内容存储到es:edi指向的内存单元中,同时edi的值根据方向标志的值增加或者减少。

 

10. jc指令

   JC(Jump if Carry)当运算产生进位标志时,即CF=1时,跳转到目标程序处


=======================================================================
==相同的指令还有:
==JNC,当CF=0时跳转;
==JZ,当ZF=1时跳转,
==JNZ,当ZF=0时跳转;
==JO,当OF=1时跳转,
==JNO,当OF=0时跳转;
==JP,当PF=1时跳转……
==依此类推,标志寄存器的各个位基本上都可以用来做“条件跳转”的条件。
==用于大小判断型的:
==  cmp op1,op2
==  JXX Label
== 其中JXX有以下几种:
==JA表示op1>op2,JNA表示op1<=op2;
==JB表示op1<op2,JNB表示op1>=op2;
==JE表示op1=op2,JNE表示op1<>op2;
==还有JAE、JNAE、JBE、JNBE等等功能重复不再赘述。
==以上是无符号数的比较。
==有符号数的比较将A换成G,将B换成L即可。
==A=above B=below G=greater L=less
======================================================================


11. ret、retf、iref的区别

  ret  弹出一个参数,给ip ,返回

  retf 弹出2个参数,一个给 ip,一个给 cs ,返回

  iref 弹出 3个参数,一个给 ip,一个 给 cs ,一个 个 flag标志位 ,返回

 

12. 汇编指令中,常用的寄存器组合为:ds:si,es:di

原创粉丝点击