您的位置:首页 > 其它

汇编语言知识点总结

2014-05-16 22:02 459 查看

微机的硬件

对于汇编程序员来说,主要关心的是cpu中的寄存器。主存储器和I/O接口是以通过地址的形式供程序员使用

寄存器
数据寄存器AX/BX/CX/DX(存放操作数和计算结果)
变址寄存器SI/DI(用来确定主存储器中储存单元的地址)
堆栈指针寄存器SP/BP/SS(用来确定堆栈段中储存单元的地址)
指令指针寄存器CS/IP(用来控制指令序列的执行流程)
标志寄存器CF/ZF/SF/OF/PF/AF(条件标志)DF/IF/TF(状态标志)

注意:
1.  PF标志仅反映最低8位中“1”的个数是偶或奇,即使是进行16位字操作。低字节中“1”的个数为0或者偶数时,PF=1.
2.  注意溢出和进位的区别。处理器在进行运算时,根据无符号数设置进位标志,根据是否超出有符号数范围设置溢出标志
段寄存器DS/CS/SS/ES
因为8086有20跟地址线,要解决16位的机器字长处理20为地址的问题,采取分段的形式访问内存,段内最大64KB

外部设备

CPU通过接口与外设通信,每一个接口有一组寄存器(数据寄存器、状态寄存器、命令寄存器),每一个寄存器都有一个独立于内存的I/O地址空间

寻址方式

由于指令系统设计了多种操作数的来源,寻找操作数的过程就是操作数的寻址,不同的寻址方式执行的速度和效率不一样。

跟数据有关的寻址方式(MOV)(注意两个操作数字长要一致)

立即寻址方式 MOV AX, 5 (直接给出操作数)

寄存器寻址方式 MOV AX, BX (在寄存器中给出操作数,CS指令不能用MOV改变)

直接寻址方式 MOV AX, VALUE 或 MOV AX, [VALUE] 或 MOV AX, [2000H] (直接给出有效地址,在内存中寻找操作数,隐含段为DS,可使用段跨越前缀指定其它段)

寄存器间接寻址方式 MOV AX, [BX](有效地址在寄存器中,不允许使用AX/CX/DX存放有效地址)

寄存器相对寻址方式 MOV AX, COUNT[SI] 或 MOV AX, [COUNT+SI](可用寄存器BX/BP/SI/DI)

基址变址寻址方式 MOV AX, [BX][SI](必须是一个基址寄存器和一个变址寄存器的组合)

相对基址变址寻址方式 MOV AX, MASK[BX][SI]

比例变址寻址方式 MOV EAX, ARRAY[ESI*4]

基址变址寻址方式 MOV EAX, [EBX][ESI*6]

相对比例变址寻址方式 MOV EAX, ARRAY[EBX][ESI*8]

与转移地址有关的寻址方式(JMP) 

段内直接寻址 JMP (NEAR PTR/SHROT)NEXT   (NEAR PTR----16位位移量, SHORT----8位位移量,有效地址为当前IP+位移量(8/16位))

段内间接寻址 JMP BX或JMP TABLE[BX](转向的有效地址是一个寄存器或存储单元的内容)

段间直接寻址 JMP FAR PTR NEXT(转向另一个代码段中的地址,修改CS和IP)

段间间接寻址 JMP DWORD PTR [INTERS+BX](用存储器中的两个相继字的内容取代CS和IP)

指令系统

数据传送指令(不影响标志位)

MOV DST, SRC(DST不能是CS,立即数不能直接送段寄存器,两个操作数不能同时为段寄存器)

MOVSX 带符号扩展传送指令,MOVZX 不带符号扩展传送指令(源操作数长度一定小于目的操作数长度)

PUSH SCR (必须以字为单位,DST不能是CS)

PUSHA/POPA (AX/CX/DX/BX依次入/出栈)

XCHG OPR1, OPR2 交换操作数(不允许使用段寄存器)

IN AL/AX, PORT/DX (I/O->CPU)

OUT AL/AX, PORT/DX (CPU->I/O)

LEA REG, SRC (有效地址送寄存器指令,REG不能是段寄存器,SRC必须是存储器寻址方式)

算数指令(影响标志位)

ADD/ADC/INC (除INC不影响CF标志外,都对条件标志位有影响) <OF=1,   两个操作数符号相同,而结果符号与之相反>

SUB/SBB/NEG/CMP (除DEC不影响CF标志外,都对条件标志位有影响) <OF=1,   两个操作数符号相反,而结果符号与减数符号相同>

MUL/IMUL (AL/AX为隐含的乘数寄存器、AX/AX&DX为隐含的乘积寄存器,SRC不能是立即数,除CF/OF,对条件标志位无定义)<MUL: CF/OF=0, 乘积的高一半为0,IMUL: CF/OF=0,乘积的高一半是低一半的符号扩展>

DIV/IDIV ( AX(DA&AX)为隐含的被除数寄存器,AL(AX)为隐含的商寄存器,AH(DX)为隐含的余数寄存器,SRC不能是立即数, 对多有条件标志位无定义)

CBW/CWD (无操作数,隐含对AL/AX进行符号扩展,不影响标志位)

DAA/DAS(压缩的BCD码加/减法调整指令,隐含的操作寄存器为AL,紧接在加减指令之后使用,除AF/CF外,对其他条件标志位无定义)

AF=1或(AL)0~3=A~F,则(AL) <-(AL) ±06H,AF=1

CF=1或(AL)4~7=A~F,则(AL) <-AL) ± 60H,CF=1

AAA/AAS(非压缩的BCD码加/减法调整指令)

AAM/AAD(非压缩的BCD码乘/除法调整指令)

NOT/AND/OR/XOR/TEST(CF/OF=0; AF无定义; 其余按照运算结果设置)

移位指令 S/R(简单移位/循环),H/A(逻辑/算数S)或O/C(不带进位/带进位R),L/R(左移/右移)
(当移位超过1位时,不能使用立即数,条件标志位CF为移入的数值,只移一位时,OF=1最高有效位的值发生变化,根据结果设置SF/ZF/PF)

串传送指令(不影响条件标志位)

REP MOVS/STOS/LODS(目的串默认附加段,源串默认数据段,CX=串长度,CLD/STD建立方向标志DF,0表示从低到高)

REPE/REPZ(相等继续比较)REPNE/REPNZ(不相等继续比较)CMPS/SCAS (DI:相比配/不匹配的字符的下一个地址,CX: 剩下的还未比较的字符的个数)

控制转移指令(不影响条件标志位)

JMP 无条件转移

JZ(JE): ZF=1转移,JNZ(JNE): ZF=0转移

JS/JNS/JO/JNO...

JC(JB/JNAE) CF=1转移,JNC(JNB/JAE) CF=0转移

JA/JAE/JB/JBE  CF&ZF=1/0

JL/JLE/JG/JGE  SF&ZF=1/0

JCXZ  CX=0转移

LOOP CX=0转移,否则循环

LOOPE/LOOPZ CX≠0&ZF=1循环

LOOPNE/LOOPNZ CX≠0&ZF=0循环

CALL 段内直接调用/段内间接调用 IP压栈

  段间直接调用/段间间接调用 CS/IP压栈

RET (立即数) 段内调用 弹IP,段间调用 弹IP/CS, 立即数表示弹出IP/CS后堆栈弹出多少个字节

INT TYPE(压标志->压CS->压IP,新 IP=TYPE*4, CS=TYPE*4+2)

IRET 从中断返回指令(INT 指令执行时,把IF和TF置零,但不影响其他标志位)



伪操作

段定义伪操作







PARA: 段起始地址的最低十六进制数位必须为0, PRIVATE: 私有段,不与其他同名段合并(这两个位默认的定位类型和组合类型)

PUBLIC: 与其他同名段合并,由连接命令决定连接顺序,每一小分段从小段(16个字节)的边界开始

COMMON: 覆盖

符号定义伪指令

等价伪指令EQU 等号伪指令= 定义符号名伪指令LABEL

WBUF LABLE WORD

BUF DB 200 DUP(0)

汇编地址计数器 $ (当前正在汇编的指令的偏移地址)

置汇编地址计数器 ORG 常数表达式   (设置当前地址计数器的值,使下一字节的地址成为参数表达式的值)

      EVEN (使下一变量或指令开始于偶字节地址)

      ALIGN 常数 (使下一变量或指令开始于常数的倍数)

基数控制伪操作  .RADIX  expression (当使用其他基数表示的常数时,使用此指令)

表达式与运算符

算数运算符

+ -*/
MOD SHL
SHR

既可以用于数值表达式也可以用于地址表达式

逻辑运算符

AND ORXORNOT

关系运算符

EQ(相等) NE(不相等)LT(小于)GT(大于)LE(小于等于)GE(大于等于)

属性运算符 PTR

数值返回运算符

SEG 分离变量或标号所在段的首地址

TYPE 分离变量或标号的类型

LENGTH 对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元数,而对于其他情况则送1。

SIZE 取出变量所含的数据存储区的大小,返回值为LENGTH*TYPE

字节分离运算符

HIGH 分离出高字节, LOW 分离出低字节

CONST  DW   0ABCDH

MOV   AH, HIGH CONST    ;    0ABHàAH  

子程序

同一模块的不同过程之间的参数传递

通过寄存器传递参数

直接访问模块中的变量

通过地址表穿传送参数地址

通过堆栈传送参数或参数地址

子程序的重入是只子程序被中断后又被中断服务程序说调用,子程序的冲入是被动的进入,递归是主动的进入

宏汇编

宏:具有宏名的一段汇编语句序列(宏定义时书写)

宏指令:这段汇编语句序列的缩写(宏调用时书写)

红展开:宏指令出用这段宏代替的过程(宏汇编时实现)

宏调用的实质是在汇编的过程进行宏展开,用宏定义的代码序列替代宏指令的过程

伪指令

LOCAL:宏定义体采用了标号,要用LOCAL进行说明,必须是宏定义MACRO语句之后的第一条语句

.XALL列出只产生目标代码的宏展开

.LALL列出包括注释项在内的所有宏展开

.SALL不列出任何展开信息

%和&,作为哑元的前缀

重复汇编

在汇编过程中,重复展开一段基本相同的语句

条件汇编

在汇编过程中,根据条件决定汇编的语句

输入输出程序设计

中断的分类

内部中断(软中断): CPU内部原因产生的中断,CPU错误、由INT指令引起的中断、DEBUG设置的中断

外部中断(硬中断): 非CPU内部原因产生的中断,分可屏蔽中断和不可屏蔽中断

从外设发出中断请求道CPU相应中断,有两个决定性的条件

1.该外设的中断请求是否被屏蔽,通过端口21H的中断相应位来决定,相应位为0表示允许中断

2.CPU是否允许响应中断,由CPU的标志寄存器FLAGS中的IF位决定

在一次中断程序处理完成后,应对20H端口发中断结束命令,第5位(EOI)置1.否则以后将屏蔽掉对同级中断的请求

主程序为响应中断应做的准备工作,以及硬件(CPU和外设接口)自动完成的工作:
主程序:(1)设置中断向量
             (2)设置8259A的中断屏蔽位
             (3)设置CPU的中断允许位
硬件:  (4)外设接口送中断请求给CPU
            (5)当前指令执行完后,CPU送响应信号给外设接口
            (6)CPU接收中断类型号
            (7)当前的FLAGS,CS和IP入栈
            (8)清除IF和TF
            (9)中断向量送IP和CS
中断处理程序
    (1)保护寄存器的内容
    (2)如允许中断嵌套,则开中断(STI)
    (3)处理中断
    (4)关中断
    (5)送中断结束命令(EOI)给中断命令寄存器
    (6)恢复寄存器内容
    (7)返回被中断的程序(IRET)

键盘I/O

每当按键动作产生,系统做如下处理:

1.主板上的键盘微控制器获得按键的扫描码,将扫描码放入I/O端口60H,并触发键盘终端INT 09H的中断请求。

2.若允许键盘中断,且CPU开中断,可进入INT 09H的ISR

3.INT 09H的ISR从端口60H读扫描码,并根据对应按键动作做出相应处理。如果是非变 换键和非特殊请求键,则生成一个16位值,存入键盘缓冲区,低字节ASCII码,高位字节扫描码。INT 09H的ISR不将按键的断码放入BUFFER

BIOS键盘中断INT 16H

显示器I/O

显存地址B000:0000、B800:0000,低字节ASCII码,高字节属性值,BIOS显示终端INT 10H
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: