第一章1、什么是汇编语言?2、汇编语言程序设计过程:编辑源程序,编译(汇编),连接,运行调试3、汇编语言特点?与机器语言一一对应,直接操作硬件,高效率(空间和时间,运行速度快,目标代码短,占用存储空间少)4、数制转换第2章8086计算机组织结构1、计算机硬件系统组成:CPU、存储器、输入输出设备。
2、CPU组成:运算器、控制器、寄存器,运算器和控制器由芯片设计时设计好,不可做任何改动,程序设计员仅能在程序里使用寄存器,寄存器都有相应的名字,如AX,能在程序里直接使用寄存器是汇编语言区别于高级语言的最重要特点,这样就可以直接控制硬件系统。
3、总线结构:数据总线、地址总线、控制总线。
数据总线分8位、16位、32位和64位等,多少位机就是以数据总线来划分,比如8位机、32位机。
8086机是16位机,但地址总线是20位,地址总线数量决定了内存寻址空间的大小,如8086有20位地址线,那么寻址空间是:220=210*1K=1M,8086最大寻址空间为1MB,即地址范围:00000H~FFFFFH。
控制总线主要传送控制信息,如读写操作,读写操作的主体是CPU,读操作是指CPU从内存或外设读取数据,写操作是指CPU把数据写到内存或外设中。
4、存储器:存储器的最小单元是字节(Byte,由8个位组成),字节的多少就是存储器的容量。
每一个字节单元都有一个唯一的编号,这个编号就是字节单元的地址,此地址就是物理地址,对于8086而言,编号的形式为:XXXXXH,如85421H。
如果要读写存储器,必须知道某一个字节单元的地址。
多个字节单元可以组合成更大的单元(数),比如2个字节单元组合成一个字(Word),4个字节单元组合成一个双字(Double Word)等,规定:这个组合后的大单元是以最小字节单元地址为自己的地址。
如85421H字节单元内容为12H,85422H 字节单元内容为34H,那么以85421H地址的字单元的内容就是3412H。
地址取最小字节单元的地址为大单元的地址。
内容排序按照“高高低低”原则:高字节放在高地址里,低字节放在低地址里。
详细请参看2.3节(P30页)5、8086CPU寄存器(1)通用类:AX(AH,AL)、BX(BH,BL)、CX(CH,CL)、DX(DH,DL)(2)段寄存器类:CS、DS、ES、SS(3)与偏移地址相关类:SI、DI、SP、BP(4)特殊类:IP、FLAGS所有寄存器都是16位大小,通用类的16位又可看成2个8位的寄存器组成,区分为高8位(High)和低8位(Low),因此取名为AH和AL,其他类似。
CS:存放代码段段地址,DS:存放数据段段地址,SS:存放堆栈段段地址,ES:存放数据附加段段地址,一般作为DS的辅助使用,比如在一段程序里需要用到2个不同数据段的数据时,其中一个数据段段地址存放在DS中,另一个存放在ES中。
SI、DI:一般用于变址寻址方式,如[BX+SI]、[BX+DI],SP:堆栈段中堆栈栈顶的偏移地址,不可修改,由SS:SP逻辑地址始终指向堆栈的栈顶。
详细参看2.3.2,P32页BP:一般也用于堆栈,可以作为SP的备份,通常也是用SS:BP逻辑地址表示,BP可以随意修改,因此通过SS:BP可以访问堆栈的任何地方。
此外,BP还与BX一样,可以作为基地址方式进行寻址,比如[BP+SI]、[BP+DI],但此时访问的数据是指堆栈段里的,如果要访问数据段的必须明显写出DS,如DS: [BP+SI]、DS:[BP+DI]IP:指令指针,有CS:IP逻辑地址始终指向下一条即将执行指令的地址,如果要使程序进行跳转,必须改变CS和IP的值,但CS和IP寄存器不能直接修改(比如用MOV),只能通过跳转指令来修改,如JZ、JMP、LOOP等。
FLAGS:标志位寄存器,记录CPU运算器的状态,可以进行位操作,CF:进位标志,ZF:运算结果0标志,SF:运算结果符号标志,OF:溢出标志,其他的暂时不需要记。
6、分段机制8086的数据线为16位,地址线为20位,寄存器也是16位的,由于读写存储器(内存)单元时,需要知道存储器单元的地址,如XXXXXH,这个地址如何在16位的数据线上传输,传输到寄存器(XXXXH)里,如何在寄存器里保存,用一个寄存器是保存不了的,必须用2个寄存器,第一个寄存器存放的地址XXXXH,我们称为段地址,放在CS、DS、ES和SS中。
物理地址=段地址*10H+偏移地址(H,全部用十六进制表示)物理地址:xxxxxH,逻辑地址:xxxxH:xxxxH,逻辑地址表示方法,冒号前面的叫做段地址,后面的叫偏移地址。
简单换算方法:逻辑地址转物理地址方式是将段地址后面加个0,与偏移地址相加即可第三章指令系统与寻址方式1、指令格式:如Tab:Mov ax, bx ; 注释Tab是标号,标号后必须紧跟一个冒号,标号代表当前指令在内存中的位置,编译成二进制代码后,标号就不存在了;Mov是操作码,表示当前指令的作用、功能;ax是目的操作数,bx是源操作数,两者表示参与指令操作的数,目的操作数存放最后指令操作的结果;分号后边的是注释,说明当前指令的过程,方便程序的阅读。
因此可以写成:“标号:操作码目的操作数,源操作数; 注释”“标号,注释”不一定每条指令都有,操作数也可能有一个,也可能没有,也可能有两个。
2、提供操作数的方式:(1)立即数;(2)通过寄存器(一般指通用寄存器);(3)通过内存(必须要提供或者能计算出内存的地址)目的操作数不能是立即数,源操作数和目的操作数不能同时为内存操作数。
3、寻址方式:将操作数来自于不同的地方进行分类:立即数寻址、寄存器寻址、内存寻址(1)立即数寻址:操作来自立即数,即立即数寻址,如mov ax, 1234H,1234H为立即数。
(2)寄存器寻址:操作数来自于寄存器,如上述指令中的ax,即为寄存器寻址。
(3)内存寻址:操作数来自于内存,需要给出或者计算出内存的地址,根据获得这个地址的方式不同,又分为以下几种方式:1)直接寻址:直接给出内存地址(一般是偏移地址),如mov ax, [1000H],1000H就是内存地址。
2)寄存器间接寻址:内存地址事先放在寄存器里,要通过取出寄存器里的值才能得到地址,如mov ax, [bx],内存的地址在bx里,假设bx里的值是1200H,那么指令首先通过bx得到1200H,再去内存找到1200H地址。
存放间接地址的寄存器只能是:bx,bp,si,di3)寄存器相对寻址:在寄存器间接寻址的基础上有个常数偏移量,如mov ax, [bx+1000H],假设bx里的值是1200H,那么指令首先通过bx得到1200H,再去内存找到1200H,然后基于这个1200H地址,向后再偏移1000H,才能得到真正要的数,所以实际上的地址是1200H + 1000H。
常量对应的是“相对”。
有多种写法:[bx+1000H]、1000H[bx]、[bx]+1000H,都可以,使用的寄存器也只能是:bx,bp,si,di4)基址变址寻址方式:在寄存器相对寻址里的“相对常量”放在另一个寄存器里,如mov ax, [bx+1000H],如果事先将1000H放在SI寄存器里,那么指令就变成:mov ax, [bx+si],这就是基址变址寻址方式,前面的bx表示基地址,si表示变化的地址,把两个寄存器的值相加才是要的内存地址,也可以写成mov ax, [bx][si],经常采取这种方式来遍历内存数据,因为只要改变si的值即可。
基地址只能用bx、bp,变地址只能用si、di。
5)相对基址变址寻址方式:在基址变址寻址方式的基础上,再加一个常量即可,如mov ax, [bx+si+2000H],把两个寄存器的值和常量相加才是要的内存地址,也可以写成mov ax, 2000H[bx+si]或者mov ax, 2000H[bx][si],基地址只能用bx、bp,变地址只能用si、di。
4、无条件转移指令:jmp 标号标号表示目的地址,标号表示对应指令在内存中的地址,一般由CS和IP组合表示,如CS:IP,CS是代码段寄存器,IP是指令指针寄存器。
如果转移不涉及到CS的变化,表示段内转移,如果CS必须改变,就是段与段之间的转移。
如果代表指令地址的标号的值事先放在寄存器或者某一个内存(一般通过寄存器间接表示)里,也可以用寄存器或内存地址代表标号,如jmp bx,执行jmp指令后,IP寄存器的值就等于bx的值了,如jmp [bx],先通过bx找到内存,再从内存中取出值来才是要转移的地址。
如果要从内存中取出4个字节来改变CS和IP,那么需要在前面加DWORD PTR,如jmp DWORD PTR [bx]。
5、指令系统(1)数据传送类:mov push/pop xchg LEA(offset)(2)算术运算类:ADD,ADC,INC,SUB,SBB,DEC,NEG,CMP,MUL,IMUL,DIV,IDIV,CBW,CWD(3)逻辑运算类:AND,OR,NOT,XOR,TEST(4)移位指令类:SAL,SAR,SHL,SHR,ROL,ROR,RCL,RCR(5)条件转移类:JZ,JNZ,JC,JNC,JS,JNS,JA,JBJG,JL第四章程序结构1、完整段定义程序框架2、伪指令常量定义:常量名EQU 表达式,如X EQU 100,常量不占数据段内存地址变量定义:变量名类型初始值,如Y db 1,2,3,类似高级语言中的数组定义,初始值可以是数字、表达式、字符、字符串等。
类型有:DB,DW,DD初始值可以是?$,?SEG,OFFSET,TYPE,LENGTH,SIZE,PTR(BYTE,WORD,DWORD)第五章顺序、分支与循环程序设计1、分支:二分支结构,多分支结构用条件转移指令实现程序的分支,用跳转表法实现多分支结构构造条件指令:CMP转移指令:JC,JNC,JZ/JE,JNZ/JNE,无符号数比较大小(Above,Below,Equal):JA,JB有符号数比较大小(Great,Less,Equal):JG,JL2、循环:Do-While结构,While-Do结构包括:循环初始化,循环体,循环控制三部分循环控制指令:LOOP,用于明确知道循环次数的应用,类似于高级语言的FOR语句循环次数事先放在CX里,每次执行LOOP时,首先让CX=CX-1,然后再检测CX是否等于0,如果等于0就停止循环,不等于0就继续循环。
以下问题是否都搞清楚了?1、汇编语言特点、优势,汇编语言指令的组成?2、编码及其含义,比如一个数01000010B可以有多种解释,比如96H也有种描述;压缩BCD 码、非压缩BCD码、及其转换。