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