-
文章目的:个人期末汇编复习
-
内容范围:涵盖的知识点主要是我校老师说的考纲部分
-
参考来源:清华大学汇编教材,csdn,博客园,一些人的个人博客网站
考试内容
进制转换(10转16,8转2,互转)
2->10
正常运算,位权
10->2
整数:同除到为0,从下往上写余数
小数:小数部分不断*2,直到为0,大于1则写1,按顺序写
2->8
三位一个
8->2
一位三个
2->16
四位一个
16->2
一位四个
10->16 16->10 8->10 10->8
利用2进制中间桥梁
额外拓展,16进制计算:
eg:05C3 3D25 05C3
+3D25 -05C3 *00AB
----- ----- -----
=42E8 =3762 =3D941
无符号,带符号数区别(0ffff),8位或16位的范围
8位有符号数范围:-128~127,其中,1000 0000(仿佛是-0用于表示-128,0fff表示-127)
无符号数:0~255
16位有符号数范围:-32768~32767,其中1000 0000 0000 0000是-32768
无符号数:0~65535
源码反码补码作用与使用,采用补码原因,互相转换,+0,-0
正数:原码,反码,补码都相同
负数:原码---位取反(符号位不变)--->反码---+1--->补码
采用补码原因:原码无法完成负数加法,反码可以,但是对0处理不了,补码可以兼备,并多表示一个最低位数字,-0即为负“最大”
发明之初,规定7位ASSCII码0~127对应128个符号,第八位用于奇偶校验(奇校验:1个数为奇数,偶校验,1个数为偶数),这个叫做标准ASCII码
但是后来ASCII不够用,第八位用来编码,表示不同的符号,这个叫做拓展ASCII码,而拓展ASCII码没有固定标准
段地址,偏移地址求物理地址
段地址*16+偏移地址=物理地址 (16位数*16等于添加'0')
14个常用寄存器的作用
中阔号[]只对寄存器有影响,lea 寄存器加中括号代表取值(把地址当作值),mov 寄存器加中括号代表取地址(把他的内容当作地址,加上段地址变成物理地址,取物理地址内的值),[]只能存bx,bi,si,bp(变址 基址寄存器),lea,[]都是*or&
数据寄存器(AX、BX、CX、DX寄存器):
AX(accumulator)累加器,是算术运算的主要寄存器。在乘、除等指令中指定用来存放操作数,以及所有的 I/O指令都使用这一寄存器与外部设备传送信息
BX(base)基址寄存器。常做存放地址使用
CX(count)计数器。常用来保存计数值,如在循环、位移和串处理指令中作隐含计数器
DX(data)数据。一般在作双字长运算时把DX和AX组合在一起存放一个双字长数,DX用来存放高位数。对于某些I/O操作,DX可用来存放I/O的端口地址
变址寄存器(SI寄存器、DI寄存器)
SI是源变址寄存器,DI是目的变址寄存器。一般用来存放地址偏移,也可以用来存放数据。但需要注意的是:在串处理指令中,SI用作隐含的源串地址,默认在DS中;DI用做隐含的目的串地址,默认在ES中;此时不能混用
指针寄存器(BP寄存器、SP寄存器)
SP(stack pointer)堆栈寄存器,SP寄存器存放栈的偏移地址,SS存放段地址
BP(base pointer)基数指针寄存器BP,它的用途有点特殊,需和堆栈指针SP联合使用的,作为SP校准使用的,只有在寻找堆栈里的数据和使用个别的寻址方式时候才能用到。比如说,堆栈中压入了很多数据或者地址,你肯定想通过SP来访问这些数据或者地址,但SP是要指向栈顶的,是不能随便乱改的,这时候你就需要使用BP,把SP的值传递给BP,通过BP来寻找堆栈里数据或者地址.
BP作为基址寄存器,一般在函数中用来保存进入函数时的SP的栈顶基址.每次子函数调用时,系统在开始时都会保存这个两个指针并在函数结束时恢复SP和BP的值
段寄存器(DS寄存器、ES寄存器)
DS(Data Segment)和 ES(Extra Segment)都属于段寄存器,用于存放的就是某个段地址
注:CPU不支持直接将立即数送入段寄存器中,如下操作方式不合法:
mov ds,1000h masm里新建asm文件的初始代码传输也分了两次
寄存器名称 | 寄存器类别 | 寄存器具体类型 | 作用 |
AX | 通用寄存器 | 数据寄存器 | 加减乘除运算,字的输入输出,中间结果缓存 |
BX | 通用寄存器 | 基址寄存器 | 存储器指针 |
CX | 通用寄存器 | 数据寄存器 | 串操作、循环控制的计数器 |
DX | 通用寄存器 | 数据寄存器 | 字的乘、除运算,间接的输入输出 |
SI | 通用寄存器 | 源变址寄存器 | 同DI一般与ds连用,存放某个数据的地址 |
DI | 通用寄存器 | 目的变址寄存器 | 存储器指针、串指令用的目的操作数指针 |
BP | 通用寄存器 | 基址寄存器 | 存储器指针、存取堆栈的指针 |
SP | 通用寄存器 | 变址寄存器 | 堆栈的栈顶指针 |
IP/EIP | 控制寄存器 | 指令指针寄存器 | 存放指令的偏移地址 |
flags/psw | 控制寄存器 | 一些flag标志位的集合 | ZF,PF,SF,CF,OF |
CS | 段寄存器 | 段寄存器 | 代码段寄存器 |
DS | 段寄存器 | 段寄存器 | 数据段寄存器 |
SS | 段寄存器 | 段寄存器 | 堆栈段寄存器 |
ES | 段寄存器 | 段寄存器 | 附加段寄存器 |
9个标志寄存器作用(6条件码3控制标志),为1为0含义
6个状态标志位:OF、SF、ZF、AF、PF、CF,及3个控制标志位DF、IF、TF
标志寄存器Flag
Flag是16位的寄存器,有9个标志位,其中6个状态标志位,3个控制标志位
6个状态标志位
CF:进位或者借位 有进位或者借位时CF=1,并且debug显示为CY
否则CF=0,debug显示为NC
PF:奇偶标志位 用于校验,运算结果低8位(AL AH等) 化为2进制 为奇数个1时PF=0 debug显示 PO
否则 偶数个1时PF=1 debug显示PE
AF:辅助进位标志 运算结果的低4位向前1位有进位或者借位时 AF=1,debug显示AC
否则无进位和借位时AF=0,debug显示NA
ZF:零标志位 运算结果为0时 则ZF=1,debug显示ZR
否则ZF=0,debug显示NZ
SF:符号标志位 运算结果为负数时,SF=1,debug显示NG
否则SF=0,debug显示PL
OF:溢出标志位 如果运算结果溢出(与常识不符合 例如两个正数相加为负数 或者两个异数相减为负数),则ZF=1,debug显示OV
否则ZF=0,debug显示NV
3、3个控制标志位
TF:追踪标志位
TF=1则单步执行,执行之后TF=0 即中断然后正常执行
IF:中断允许标志位
IF=1,则允许CPU响应外部中断 debug 显示EI
IF=0,则禁止 debug显示DI
DF:方向标志位
DF=1,地址减方向 debug显示DN
DF=0,地址增方向 debug显示UP
识别一条指令寻址方式,源目标操作数寻址方式,取值规则,求有效地址
与数据有关的寻址方式
下面以数据传送指令MOV为例来说明。其汇编格式为:MOV 目标, 源
1.立即寻址方式(immediate addressing)
操作数直接包含在指令中,紧跟在操作码之后的寻址方式称为立即寻址方式,把该操作数称为立即数。
MOV AL, 6 ;(AL)=6
2.寄存器寻址方式(register addressing)
操作数直接包含在寄存器中,由指令指定寄存器号的寻址方式。
MOV BX, AX ;(BX)=(AX)
除以上两种寻址方式外,以下各种寻址方式的操作数都在存储器中,其操作数称为存储器操作数。
由于80X86对内存采用分段管理,因此由以下寻址方式得到的只是有效地址(简写为EA-effective address,在IBM PC中就是操作数地址的偏移量部分)。
有效地址可以由以下四种成分组成:
位移量(displacement)是存放在指令中的一个8位、16位或32位的数,它是一个地址。
基址(base)是存放在基址寄存器中的内容。通常用来指向数据段中数组或字符串的首地址。
变址(index)是存放在变址寄存器中的内容。通常用来访问数组中的某个元素或字符串中的某个字符。
比例因子(scale factor)是80386以上CPU新增加的。其值可为1、2、4或8。寻址中,可用变址寄存器的内容乘以比例因子来取得变址值。
EA=基址+(变址x比例因子)+位移量
3.直接寻址方式(direct addressing)
操作数的有效地址直接包含在指令中的寻址方式。
有效地址存放在代码段的指令操作码之后,但操作数本身在存储器中,所以必须先求出操作数的物理地址。这种寻址方式常用于存取简单变量。
MOV AL, [78H]
由于在汇编语言中用符号表示地址,所以指令“MOV AL,VAR”中的源操作数寻址方式是直接寻址,有时也写做“MOV AL,[VAR]”
4.寄存器间接寻址方式(register indirect addressing)
操作数的有效地址在基址寄存器BX、BP或变址寄存器SI、DI中,而操作数在存储器中的寻址方式。对于386以上CPU,允许使用任何32位通用寄存器。
若以SI、DI、BX间接寻址,操作数在数据段中,操作数地址为DS左移四位加上SI、DI、BX其中之一的内容。
若以BP间接寻址,则操作数在堆栈段区域内,操作数地址为SS左移四位加上BP的内容。
MOV AL, [BX]
5.寄存器相对寻址方式(register relative addressing)
也称为直接变址寻址方式。操作数的有效地址是一个基址(BX、BP)或变址(SI、DI)寄存器的内容和指令中给定的一个位移量(disp)之和。有效地址由2部分组成。对于386以上允许使用任何32位通用寄存器。
即:EA=(基址<或变址>寄存器)+disp
例: MOV AL, 8[BX] 或MOV AL, [BX+8]或MOV AL,[BX]COUNT
6.基址变址寻址方式(based indexed addressing)
操作数的有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。缺省使用段寄存器的情况由基址寄存器决定。允许使用段超越前缀。
MOV AL,[BX][SI] 或MOV AL,[BX+SI]
7.相对基址变址寻址方式(relative based indexed addressing)
操作数的有效地址是一个基址和一个变址寄存器的内容和指令中给定的一个位移量之和。有效地址由三部分组成.缺省使用段寄存器的情况由基址寄存器决定。允许使用段超越前缀。
MOV AL,MASK[BX][SI] 或MOV AL,MASK[BX+SI]或MOV AL,[MASK+BX+SI]
8.比例变址寻址方式(scaled indexed addressing)
注意:80386以上的微处理器才提供。
EA=(基址寄存器)+(变址寄存器)×比例因子+disp
其优点在于:对于元素大小为2、4、8字节的数组,可以在变址寄存器中给出元素下标,而由寻址方式控制直接用比例因子把下标转换为变址值。
可以看出,它实际上是386以上CPU存储器操作数寻址方式的通用公式。
MOV AX, ARY[BX][4*SI]
根据要求写指令,条件转移.逻辑指令,in,out
段内直接寻址
这种寻址方式用于条件转移和无条件转移指令,但是,当它用于条件转移时,位移量只允许8位。无条件转移指令在位移量为8位时,叫短跳转,位移量16位叫近跳转。
如果位移量为16位,则在符号地址前加操作符NEAR PTR。如果位移量为8位,则在符号地址前加操作符SHORT。
JMP NEAR PTR PROGIA
JMP SHORT QUEST
段内间接寻址
转向有效地址是一个寄存器或是存储单元的内容,这个寄存器或存储单元的内容可以用数据寻址方式中除立即数以外的任何一种寻址方式取得,所得到的转向的有效地址用来取代IP寄存器的内容。
JMP WORD PTR[BP+TABLE] 其中WORD PTR又称为操作符(伪),用以指出其后的寻址方式所取得的转向地址是一个字的有效地址,也就是说它是一种段内转移。
物理地址=l6d×(CS)十EA
段间直接转移
指令中直接提供了转向段地址和偏移地址,所以只要用指令中指定的偏移地址取代IP寄存器的内容,用指令中指定的段地址取代CS寄存器的内容就完成了从一个段到另一个段的转移操作,
这种指令的汇编语言格式可表示为:
JMP FAR PTR NEXTROUTINT
其中,NEXTROUTINT为转向的符号地址,PAR FAR 则是表示段间转移的操作符。
so,需要一个新的段地址+偏移地址转向
段间间接转移
用存储器中的二个相继字的内容来取代IP和CS寄存器中的原始内容以达到段间转移约目的。这里存储单元的地址是由指令指定除立即数方式和寄存器方式以外的任何一种数据寻址方式取得,如下图所示。
这种指令的汇编语言格式可表示为:
JMP DWORD PTR[INTERS+BX]
其中,[INTERS+BX]说明数据寻址方式为直接变址寻址方式,DWORD PTR为双字操作符,Ptr相当于显示声明,跳转到的地址以DWORD双字的形式访问。说明转向地址需要取双字为段间转移指令。
转移的偏移地址*
JMP NEAR PTR 5119H IP=2BC0H EA=5119+03+2BC0=7CDCH,IP+3为next code 首地址,物理地址求法一样,->转移的偏移地址是,相对于段地址的偏移地址
JMP WORD PTR [BX] IP=((DS)*10+(BX))
JMP WORD PTR [BX+D] IP=((DS)*10+(BX+)+D)
MIND:JMP 0C6H为向上转移,位移量为负数,先用100h-0C6h=-3ah,再用ip+此得数据
AND:AND操作可用于清除一个或多个位
OR:OR运算可用于设置一个或多个位
XOR:用于清除寄存器,与0,1异或
TEST指令与AND操作的作用相同,但与AND指令不同,它不会更改第一个操作数
NOT指令实现按位NOT操作。操作数可以在寄存器中,也可以在内存中。
ADD,ADC,INC
SUB,SBB,DEC,NEG(相当于用零减去操作数,neg负数相当于求绝对值,neg正数就是求补码)
CMP也是减法,不保存结果,只设置条件位置
MUL,IMUL(带),al,ax,dx:ax
DIV, IDIV(带),被除数ax,商在al,余数在ah||DX:AX,商在ax,余数在dx
(AX)=0400H,(DL)=0B4H
DIV DL的结果是: (AH) = 7CH = 124D 余数 (AL)=05H=5D 商
IDIV DL的结果是: (AH)=24H=36D 余数 (AL)=0F3H=-13D 商
IN AL,21H;表示从21H端口读取一字节数据到AL
OUT 21H,AX;将AX的值写入端口地址21H开始的连续两个字节
指令执行对标志位的影响
[指令执行对标志位影响网址](https://blog.csdn.net/yeahhook/article/details/8754234)
判断对错,说明理由mov al,bx
[汇编常见错误网址](https://www.cnblogs.com/cway/p/12794979.html)
移位指令,循环指令,传送指令,串指令格式,功能
算术左移指令SAL 左移一次,最低位补0,最高位送入CF标志位 可用于有符号操作数做x2的n次幂运算
算术右移指令SAR 右移一次,最高位保持不变,最低位送入CF标志位 可用于有符号操作数做/2的n次幂运算
逻辑左移指令SHL 同SAL
逻辑右移指令SHR 右移一次,最高位补0.区别!最低位送入CF标志位 用于实现无符号数/2的n次幂操作
循环左移指令ROL 左移一次,左移前的最高位送入最低位以及CF.
循环右移指令ROR 右移一次,右移前的最低位送入最高位以及CF.
带进位的循环左移指令RCL 左移一次,左移前的最高位送入CF,CF的内容送入最低位
带进位的循环右移指令RCR 右移一次,右移前的最低位送入CF,CF的内容送入最高位
栈底画在高处,栈底画在低处,存数据先高位后低位,从栈顶往栈底存
PUSH:进栈指令先使堆栈指针SP-2,然后把一个字操作数存入堆栈顶部
POP:出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP+2
表转换指令XLAT (了解)
格式 XLAT 或XLAT 首地址
功能:将AL与BX寄存器内容之和作为偏移地中,将其所对应的存储单元的内容送入AL寄存器。
执行前:在内存建立一个字节表格,内含要转换成的目的代码
BX——存放表格首地址
AL——存放相对表格首地址的偏移量
执行后:将AL寄存器的内容转换为目标代码
指针传送指令LDS,LES
LDS r16,mem;r16←mem, DS←mem+2
LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器
LES r16,mem;r16←mem, ES←mem+2
LES指令将主存中mem指定的字送至r16,并将mem的下一字送ES寄存器
LES DI,[BX] ,(DI)=[bx],(ES)=[bx+1]
这两个指令取的是内容,而不是地址
符号扩展cbw,cwd,拓展规则
零位扩展
对于无符号数,进行零位扩展
►前面加0实现位数扩展 MOVZX AX,CL cl拓展为ax位(16位)放ax
符号扩展
对于有符号数,进行符号扩展
►前面加符号位(最高位)实现位数扩展 MOVSX
CBW AL->AX,CWD AX->DX:AX 根据最高位的有效位拓展
中断的基本概念与分类
中断:让cpu停止执行程序,而去执行特殊事件
分类:硬件中断——由外部硬件产生的,也称外部中断。
非屏蔽中断:通过CPU的NMI引入,它不受内部中断允许标志位IF的屏蔽,一般在一个系统中只允许一个非屏蔽中断。
可屏蔽中断:通过CPU的INTR引入,它受IF的控制,只有在IF=1时,CPU才能响应中断源的请求。当IF=0时,中断请求被屏蔽。
软件中断——CPU根据软件的某些指令或软件对标志寄存器某个标志位的设置而产生的,由于它与外部中断电路完全无关,故称为内部中断。
中断向量表定义,作用,入口地址计算?
中断向量表
存放中断地址的一段内存空间称中断向量表。
表的地址位于内存的:0000H~03FFH 1KB大小,共256个入口ff
中断向量地址指针 = 4 * 中断类型码
每个入口占用4个单元,依次位IP:CS,低字节为段内偏移IP,高字节为段基址CS。
变量定义,内存分配,占字节计算
宏指令; 宏定义, 宏调用, 宏展开,求运算结果
宏指令,直接在编译阶段宏展开,对于子程序而言,损失内存,加快速度
必须先定义,后调用,故宏内调用宏,被调用的写于上面
格式: macro name macro p1,p2(哑元,可以是操作码)
endm
&分隔符 ,J&p1 ,给定p1为nz,则宏展开为jnz
%,把表达式值转换为数,并取代哑元
LOCAL ,汇编宏定义内部可以使用标号,LOCAL跟内部标号名,防止和外部标号重复在,定义展开为(??0000~??FFFF)
使用时 在宏第一行写 LOCAL 标号1,标号2
rept expression
代码
endm重复expression次代码
if expression(非0满足),if1,第一遍扫视期间满足
格式: if x 1 else 2 endif若x非0,执行1,否则执行2,若程序无else语句,直接endif结束
子程序
段内直接调用
(1)格式:CALL OPR
(2)执行操作:先保存断点:S P ← S P - 2 SP←SP-2SP←SP-2,将C A L L CALLCALL的下一条指令的I P IPIP入栈;在将子程序名O P R OPROPR代表的偏移地址→ I P \to IP→IP,转到子程序执行。
(3)功能:子程序名直接写在指令中,作段内调用。
段内间接调用
(1)格式:CALL WORD PTR OPR
(2)执行操作:将断点处的IP入栈保存;如果子程序的偏移地址在16位寄存器中则把寄存器的内容→ I P \to IP→IP;如果其偏移地址是用存储器中的一个字指出,则把改存储器单元的内容→ I P \to IP→IP。
(3)功能:子程序的偏移地址由寄存器或存储单元指出,作段内调用。
段间调用
段间直接远调用
(1)格式:CALL FAR PTR OPR
(2)执行操作:先将C A L L CALLCALL的下一条指令的CS和IP分别入栈;再把子程序的偏移地址→ I P \to IP→IP,子程序所在段的段地址→ C S \to CS→CS。
(3)功能:子程序名用F A R P T R FAR\ PTRFAR PTR属性直接写在指令中,作跨段调用。
段间间接调用
(1)格式:CALL DWORD PTR OPR
(2)执行操作:先将CALL的下一条指令的CS和IP分别入栈;再把存储单元的( E A ) → I P (EA)\to IP(EA)→IP,( E A + 2 ) → C S (EA+2)\to CS(EA+2)→CS。
(3)功能:子程序名保存在双字单元中,第一个字作偏移地址,第二个字作为段地址,做跨段调用。
返回指令R E T RETRET
格式:RET [n]
执行操作:
(1)段内返回(近返回)时,从堆栈段中弹出的断点仅修改I P IPIP;
(2)段间返回(远返回)时,从堆栈段中弹出断点的偏移地址→ I P \to IP→IP,再弹出断点的段地址→ C S \to CS→CS;
(3)如果是RET n指令,表示弹出断点后,再将堆栈段指针S P + n SP +nSP+n之后再返回。
功能:用于子程序中,返回到主程序的断点处继续执行。执行时,将断点从堆栈中弹出,修改IP或修改I P IPIP、C S CSCS。
(1)程序名是子程序入口地址的符号表示。同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性。
(2)P R O C PROCPROC表示子程序定义开始,E N D P ENDPENDP表示子程序定义结束。
(3)类型属性分为NEAR进程属性和FAR远程属性。如果不写属性,系统默认为NEAR属性。
程序题:20来个程序,a,b卷每个程序都有
找某个指定字节,数据,字符,做字符替换
定义变量后求值,字符(串)输入输出
字符串里字符传送
大小写变换
计算字符串长度
输入输出10,16进制(重点)
计算数组的元素平均值
数组的分类存储
字符前导后续字符怎么求
堆栈使用规则
串传送,连接,比较,存储,搜索
计算多个数的最大最小,平均值,累加和累乘积
编写宏指令(a,b都有)
统计2进制数据0,1个数,判断有无1,0
考试设置双循环的分析设计,分支的设计
子程序也会考到