《汇编语言》章节知识整理

第一部分.嵌入式汇编

第一章.基础知识

CPU执行机器指令,利用编译器将高级语言源程序转换成目标程序(代码),计算机系统最终运行目标程序。

CPU基本功能:执行机器指令,暂存少量数据、访问寄存器。

ASCII码:0~9对应30H~39HA~Z对应41H~5AHa~z对应61H~7AH,' '(空)对应20H,'\0'对应0H

第二章.IA-32处理器基本功能

保护方式:32根地址线有效,寻址4GB的物理空间。

实地址方式:处理器重新开始运行后的最初工作方式。仅能访问1MB物理地址空间,范围00000H~FFFFFH。支持存储器分段管理,每个存储段大小限于64KB

通用寄存器

32位寄存器:EAX EBX ECX EDX EBP ESP EDI ESI

16位寄存器:AX BX CX DX BP SP DI SI

高8位寄存器:AH BH CH DH

低8位寄存器:AL BL CL DL

标志寄存器EFLAGS,32位,含有一组状态标志,系统标志,控制标志。

CF:第0位,进位标志,运算结果最高位产生进位/借位时置1,否则清0。

ZF:第6位,零标志,运算结果为0置1,否则清0。

SF:第7位,符号标志,运算结果最高位为1(负数)时置1,否则清0。

OF:第11位,溢出标志,有符号数加减结果溢出(127/-128,32767/-23768,231-1/-231)置1,否则清0。

PF:第2位,奇偶标志,结果最低字节(8位)中1的个数,偶数置1,奇数清0。
AF:第4位,辅助进位标志,反映算术运算第三位或最低四位是否有进位/借位,有则置1,无则清0。

段寄存器

代码段、数据段、堆栈段。

逻辑地址:段号:段内地址 或 段号:偏移

物理地址 = 段起始地址 + 偏移

段寄存器:代码段寄存器CS、堆栈段寄存器SS、数据段寄存器DS、附加段寄存器ESFSGS

CS指定当前代码段,SS指定当前堆栈段,DS指定当前数据段。

寻址方式

立即寻址:MOV EAX, 12345678H,仅限源操作数。

寄存器寻址:ADD DI, BX,执行速度快,源/目标操作数均可使用。

直接寻址:MOV ECX, [95480H],有效(物理)地址,源/目标操作数均可使用,但不可两个操作数均为存储单元。

寄存器寻址:SUB DX,[EBX],间接给出存储单元有效地址,要求和直接寻址类似。

通用表示:MOV EBX, [EDI+EAX*4+300H],基址寄存器(32位),变址寄存器(32位,无ESP),比例因子(1/2/4/8)

位移量(8位/16位/32位,自动扩展为32位)。

指令指针寄存器

EIP/IP:指向下一条指令地址(有效地址),CS+EIP = 物理地址。

堆栈

对应高级语言的栈,后进先出,堆栈段寄存器SS存有栈号,ESP存放偏移(有效地址),指向栈顶。

用途:(1)保护寄存器内容或保护现场。(2)保存返回地址。(3)传递参数。(4)安排局部变量,临时变量。

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

MOV DEST, SRC:将数据从通用寄存器/存储单元/立即数传入通用寄存器/存储单元。

XCHG OPED1, OPRD2:内容交换,通用寄存器/存储单元,尺寸一致,不能同时为存储单元。

简单加减指令(运算不受标志寄存器影响,但会改变标志寄存器)

ADD DEST, SRC:加法,操作数尺寸一致,SRC为通用寄存器/存储单元/立即数,DEST为通用寄存器/存储单元。

SUB DEST, SRC:前减后,尺寸一致,SRC为通用寄存器/存储单元/立即数,DEST为通用寄存器/存储单元。

INC DEST:DEST++,操作数为通用寄存器/存储单元。(不影响CF)

DEC DEST:DEST--,操作数为通用寄存器/存储单元。(不影响CF)

NEG DEST:取相反数,操作数为通用寄存器/存储单元。

状态标志操作指令

CLC:清进位标志,将CF位清0。

STC:置进位标志,将CF位置1。

CMC:进位标志取反,CF位由0变为1/从1变为0。

LAHF:获取状态标志,将标志寄存器低8位送到通用寄存器AH中,EFLAGS不变。

SAHF:设置状态标志,将AH中第0、2、4、6、7位传入EFLAGS中,保留位1、3、5不变。

带进位加法指令

ADC DEST, SRC:带进位加法,DEST+=SRC+CF,操作数要求与ADD一致。

SBB DEST, SRC:带借位减法,DEST-=SRC+CF,操作数要求与SUB一致。

条件转移指令(不影响标志位,改变EIP,范围一个代码段64K

Jcc LABEL:这里举几个重要例子,更多翻书P45

JZ LABEL:ZF=1,运算结果等于0转移。

JNZ LABEL:ZF=0,运算结果不等于0转移。

JB LABEL:PF=1,无符号,比较结果<转移。(JNB,不低于转移)

JL LABEL:SF!=OF,带符号,比较结果<转移。(JNL,不小于转移)

JA LABELCF=0&&ZF=0,无符号,比较结果>转移。(JNA,不高于转移)

JG LABELZF=0&&SF=OF,带符号,比较结果>转移。(JNG,不大于转移)

JMP LABEL:无条件段内直接转移,类似goto语句。

比较指令

CMP DEST, SRC:前减后,改变标志寄存器,不改变操作数,两操作数尺寸一致。

取有效地址指令

LEA REG, OPRD:把OPRD(存储器)有效地址送到REG(通用寄存器16/32位),类似指针,不影响标志位

LEA EBX, [EDI + EAX * 4 + 300H],可用于取地址,也可用于计算(不影响标志位)。

堆栈操作指令

PUSH SRC:源操作数(32/16位通用寄存器,段寄存器,双字/字存储单元,立即数)压栈

ESP减存储大小,数据送到ESP位置。

POP DEST:弹栈,将一个双字/字数据送到DEST(32/16位通用寄存器,段寄存器,双字/字存储单元,立即数)

根据目标操作数大小弹栈,至少弹出一个字(16位)。

PUSHA:将AX、CX、DX、BX、SP、BP、SI、DI依次压栈,SP-=16

POPA:从堆栈以与PUSHA相反顺序送到通用寄存器,SP+=16

PUSHAD:将EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI依次压栈,SP-=32

POPAD:从堆栈以与PUSHAD相反顺序送到通用寄存器,SP+=32

第三章.程序设计初步

过程调用和返回指令

过程(procedure):子程序。调用子程序(过程,函数):控制转移,考虑返回。

过程调用指令:由主程序转移到子程序;过程返回指令:由子程序返回到主程序。

CALL LABEL:过程调用,LABEL是程序中的标号或过程名。

段内调用:压返回地址EIP入栈,再实现转移。段间调用:压CS(代码段)、返回地址EIP入栈,再转移。

RET:过程返回,堆栈弹出返回地址偏移,送到EIP,转移到该地址。

参数传递

寄存器传递法:一般ECXEDX传递入口参数,EAX传递出口参数;

堆栈传递法:主程序在调用子程序之前,将需传递参数依次压栈,再从堆栈中取入口参数。(不占寄存器,复杂)

入口参数从右向左压栈。堆栈中可以存放动态局部变量。

算术逻辑运算指令

MUL OPRD:无符号乘法,由操作数位数决定与AL/AX/EAX相乘送入AX/DX:AX/EDX:EAX中。

IMUL OPRD:有符号乘法,与MUL类似。

IMUL DEST, SRC:双操作数有符号乘DEST=DEST*SRC(DEST16/32位通用寄存器,SRC寄存器/存储单元/立即数)

IMUL DEST, SRC1, SRC2DEST16/32位通用寄存器,SRC1为通用寄存器/存储单元,SRC2为立即数。

DIV OPRD:无符号数除法,OPRD为除数,8/16/32位对应被除数AX/DX:AX/EDX:EAX,结果商在低位,余数高位

IDIV OPRD:有符号数除法,被除数/除数均视为有符号数,不能整除时余数符号与被除数一致,绝对值小于除数

带符号扩展指令

CBW:字节转换为字,将寄存器AL中符号扩展到AH

CWD:字转换为双字,将AX中符号扩展到DX

CDQ:双字转换为四字,将EAX中符号扩展到EDX

CWDE:字转换为双字,将AX中符号扩展到EAX高16位。

无符号数扩展:异或XOR指令把高8/16/32位直接清0。

扩展传送指令(不改变源操作数,不影响标志寄存器)

MOVSX DEST, SRC:符号扩展传送,将SRC符号扩展后送到DESTDEST尺寸必须大于SRC尺寸。 (SRC为通用寄存器/存储单元,8/16位,DEST为通用寄存器,16/32位)。

MOVZX DEST, SRC:零(无符号)扩展传送,高位置0,要求与MOVSX一致。

逻辑运算指令

NOT OPRD:否运算,操作数按位取反,送回OPRD

AND DEST, SRC:按位与运算,使CF=0,OF=0,PF/ZF/SF反映运算结果。

OR DEST, SRC:按位或运算,结果送DEST

XOR DEST, SRC:按位异或运算,CF=0,OF=0,PF/ZF/SF反映运算结果。

TEST DEST, SRC:两个操作数按位与,结果不送到DEST,仅改变标志位,改变同AND

移位指令OPRD通用寄存器/存储单元,CF(进位标志)受影响、SF/ZF/PF反映移位结果、OF情况复杂)

SAL OPRD, count:算术左移,count为8位立即数或寄存器CL(移位数0~31,截取低5位),用0补足,高位进CF

SHL OPRD, count:逻辑左移,同SAL

SAR OPRD, count:算术右移,符号位保存不变,最低位进入CF位,count同上。

SHR OPRD, count:逻辑右移,高位用0补足,低位进入CF位,count同上。

循环移位指令OPRD通用寄存器/存储单元,CF(进位标志)受影响、SF/ZF/PF反映移位结果、OF情况复杂)

ROL OPRD, count:左循环移位,每左移一位,最高位移入最低位,且移入CF,count要求同移位指令。

ROR OPRD, count:右循环移位,每右移一位,最低位移入最高位,且移入CF

RCL OPRD, count:带进位左循环移位,每左移一位,最高位移入CF位,CF位移入最低位。

RCR OPRD, count:带进位右循环移位,每右移一位,最低位移入CF位,CF位移入最高位。

双精度移位指令(目的OPRD1为通用寄存器/存储器单元,字/双字;源OPRD2为寄存器,尺寸与OPRD1一致,count同上

移动一位,符号位变化,置OF(溢出位)为1,否则清0,同时影响SF/ZF/PFAF无定义)

SHLD OPRD1,OPRD2,count:双精度左移,OPRD1左移count位,最后一位传CF,低位用OPRD2高count位补。

SHRD OPRD1,OPRD2,count:双精度右移,OPRD1右移count位,最后一位传CF,高位用OPRD2低count位补。

分支程序

编译优化:不优化,多与内存打交道;优化使速度最大化后,多与寄存器打交道,减少转移。

无条件和条件转移指令

段内转移(近转移):仅重新设置指令寄存器EIP转移,未重置CS

段间转移(远转移):重置EIPCS,转移后的指令在另一个代码段中。

JMP LABEL:无条件段内直接转移,机器指令由操作码OP和地址差rel组成,EIP+rel实现转移,相对转移。

JMP OPRD:无条件段内间接转移,OPRD是32位通用寄存器/双字存储单元,内容直接存入EIP

无条件段间转移在后面章节介绍。

条件转移指令:相对转移,EIP+rel表示转移位置。

循环程序

LOOP LABEL:计数循环,ECX-=1不影响标志位),结果不为0则转到LABEL继续执行。最多进行232次。

LOOPE LABEL:等于/全零循环,ECX-=1不影响标志位)若结果不为0,且ZF=1(零标志),转到LABEL处。

LOOPZ LABEL:同上。

LOOPNE LABEL:不等于/非零循环,ECX-=1(不影响标志位),若结果不为0,且ZF=0,转到LABEL处。

LOOPNZ LABEL:同上。

JECXZ LABEL:计数器转移,当ECX=0时转移到LABEL处。循环开始前使用,保证n=0(while(i<n))时正常执行。

子程序设计

堆栈传递入口参数,寄存器(EAX)传递出口参数。

寄存器作为局部变量效率高,堆栈安排局部变量数量多。

约定会保护寄存器EBX/ESI/EDI/EBP,不保护EAX/ECX/EDX,自己保护。

子程序说明:(1)子程序名(或入口标号);(2)子程序功能描述;(3)子程序入口参数和出口参数。

第四章.字符串操作和位操作

第五章.VC目标代码的阅读理解

第二部分.完整汇编

第六章.汇编语言

第七章.BIOS和虚拟机

第八章.输入输出和中断

第九章.保护方式程序设计

notes:主要面向NUAA学生所学《汇编语言》课程,课本为《新概念汇编语言》,鉴于该书知识较为繁杂,内容较多,做作业、实验、课设时不方便定位每章知识点,在此对每章知识点做出简单归纳,随缘更新,欢迎交流指正。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
汇编语言是一种低级的计算机语言,它直接与计算机硬件进行交互。下面是汇编语言的基础知识整理: 1. 汇编语言的作用:汇编语言用于编写底层程序,如操作系统、驱动程序和嵌入式系统等。 2. 汇编语言的特点:汇编语言是一种符号化的机器语言,使用助记符来代替二进制指令,使程序更易读和理解。 3. 寄存器:寄存器是汇编语言中最基本的数据存储单元,用于存储数据和执行运算。常见的寄存器有通用寄存器、指针寄存器和标志寄存器等。 4. 指令:汇编语言的指令是对计算机硬件进行操作的命令。指令包括数据传输指令、算术运算指令、逻辑运算指令和控制指令等。 5. 内存访问:汇编语言通过内存地址来读取和存储数据。内存地址由段地址和偏移地址组成,通过段地址和偏移地址可以唯一确定内存中的一个位置。 6. 标志位:标志位是标记计算机状态的标志位,用于判断运算结果是否满足某些条件。常见的标志位有零标志位、进位标志位和溢出标志位等。 7. 标号和跳转:汇编语言中可以使用标号来标记程序中的位置,通过跳转指令可以根据条件或无条件地跳转到指定的标号处。 8. 子程序和栈:子程序是一段独立的代码块,可以在程序中被多次调用。栈是一种后进先出的数据结构,用于保存程序执行过程中的临时数据和返回地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值