大家好,又见面了,我是你们的朋友全栈君。
数据的表示和类型 二进制:二进制的表示元素是0和1,书写时,在数据后面紧跟一个字母B,如:0101B 八进制:八进制的表示元素是:0-7,书写时,在数据后面紧跟字母Q,如1234Q 十六进制:基本元素是0-9,A-F,其中A-F依次代表10-15 ▮书写时,数据后面紧跟字母H,当十六进制的第一个字符是字母时,在其前面必须添加一个“0” 寄存器 16位寄存器:
数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间
它们可做一般的存储器的指针使用,在字符串操作指令的执行过程中,对它们有特定的要求,且具有特殊的功能
(1)BP为基指针寄存器,用它可直接存取堆栈中的数据 (2)SP为堆栈指针寄存器,用它只可访问栈顶
物理地址的形成模式 逻辑段的起始地址(俗称段地址)必须是16的倍数,即最低4位二进制必须全为0; 物理地址PA=段地址*16+偏移量
段寄存器的引用 取指令所用的段寄存器和偏移量一定是用CS和IP; 堆栈操作所用的段寄存器和偏移量一定是SS和SP; 串操作的目标操作数所用的段寄存器和偏移量一定是ES和DI;
操作数的寻址方式
1.立即寻址方式:MOV AH,80H ADD AX,1234H 2.寄存器寻址方式 :MOV AH,BH 3.直接寻址方式:MOV AX,[1234H] 4.寄存器间接寻址方式:MOV BX,[DI] 5.寄存器相对寻址方式:MOV BX,[SI+100H] 6.基址加变址寻址方式:MOV BX,[BX+SI] 7.相对基址加变址寻址方式:MOV BX,[BX+SI+100H]
合法标识符 标识符最多由31个字母,数字及规定的特殊字符(?@ _ $)等组成,不能用数字开头 关键字不能作为标识符 常见的偏移量伪指令 Even、Align、org Even 偶对齐伪指令 本伪指令下面的内存变量从下一个偶地址单元开始分配 Align NUM,NUM必须是2的幂 ORG 数值表达式,本伪指令下面的内存变量从该“数值表达式”所指定的偏移量开始分配。 重复说明符 count DUP(表达式,表达式…) 例如:BUFFER DB 100DUP(?),重复100个? LEA指令和OFFSET的联系与区别 相同:都是取偏移指令的操作 注意事项:1.lea、offset指令的源操作数必须是内存操作数 2.lea、offset指令的目的操作数必须是16位寄存器 3.lea指令不影响状态标志寄存器内容。 区别:4.offset指令的源操作数不能是下标(类似数组),lea可以。 5.offset在汇编时生效,lea在指令执行时才生效。 内存变量和标号的属性 1.类型属性操作符:TYPE是返回该变量所占字节数,或标号的远近类型。
2.长度属性操作符:LENGTH是针对内存变量的操作符,它返回重复操作符DUP中的重复数。如果有嵌套的DUP,只返回最外层的重复数。如果没有DUP,则返回1 3.容量属性操作符:SIZE是针对内存变量的操作符 SIZE(变量)=LENGTH变量×TYPE变量 强制属性操作符 数据类型 PTR 地址表达式 例如:MOV byte ptr[BX],1H 存储单元别名操作符 操作符THIS的一般格式为:<变量名>equ this <类型> <变量名>DB|DW|DD <表达式> 例如:WBUFFER EQU THIS WORD BUFFER DB 20DUP(?) 进制伪指令RADIX .RADIX exp 伪指令前面要用点开始,exp的值必须是[2,16]内的一个整数 .radix 8 B1 DB 10,11,12 这三个数是八进制 等价语句 符号名 EQU 表达式 ,其作用是用左边的符号名来代表右边的表达式 例如:GREETING EQU ‘How are you!’ 在该定义之后,就可以使用符号GREETING 来代表字符串‘How are you!’
指令系统是CPU指令的集合,CPU除了具有计算功能的指令外,还有一些实现其他功能的指令,也有为某种特殊的应用而增设的指令。 指令按其功能分成以下几大类:数据传送指令、标志位操作指令、算术运算指令、逻辑运算指令、移位操作指令、位操作指令、比较运算指令、循环指令、转移指令、条件设置字节指令、字符串操作指令、ASCII-BCD码运算调整指令和处理器指令等。
数据传送指令
注意:①两个操作数的数据类型要相同,要同为8位、16位 ②两个操作数不能同时为段寄存器, ③代码段寄存器CS不能为目的操作数,但可作为源操作数 ④立即数不能直接传给段寄存器 ⑤立即数不能作为目的操作数 ⑥指令指针IP,不能作为MOV指令的操作数 ⑦两个操作数不能同时是存储单元
加法指令 1.ADD加法指令:把源操作数的值加到目的操作数 2.ADC带进位加指令:把源操作数和进位标志CF一起加到目的操作数 3.INC指令:操作数的值加1 4.交换加指令XADD:先交换两个操作数的值,在镜像加法运算
减法指令 1.SUB减法指令:从目的操作数中减去源操作数 2.SBB带借位减法:把源操作数和标志位CF的值从目的操作数中一起减去 3.DEC减法:把源操作数的值减去1 4.求补指令NEG:改变操作数的正负号 乘法指令 MUL指令:隐含目的操作数,把源操作数和AL(AX)的值相乘保存到AX(DX+AX)中 除法指令 DIV指令:
系统提供了四条数据类型转换指令:CBW、CWD、CWDE、CDQ CBW字节转换为字指令:隐含操作数AH和AL,其功能是用AL的符号位去填充AH CWD字转换为双字指令:隐含操作数DX和AX,其功能是用AX的符号位去填充DX
逻辑与指令 指令格式:AND Reg/Mem,Reg/Mem/Imm
逻辑或指令 指令格式:OR Reg/Mem,Reg/Mem/Imm
逻辑非 指令格式:NOT Reg/Mem
TEST指令 格式:TEST Reg/Mem,Reg/Mem/Imm 功能是对两个操作数进行逻辑与运算,但结果不送至目的操作数,只是影响状态标志 作用是检测一些条件是否满足,但又不希望改变操作数,即使用于检查一个字节或字中的某些特定位是否有一位为1
1.SHL指令(逻辑左移) 相当于将数倍增
2.SHR指令(逻辑右移) 将一个无符号数向右移动,左边出现空位补0,右边低位移至CF
3.SAL指令(算术左移) SAL指令同SHL,实际上SHL和SAL是同一条指令的两种助记符,它们执行的操作完全一样。 4.SAR指令(算术右移) SAR类似于SHR,SAR同SHR的区别是:SHR连同符号位一起右移,左边最高位出现的空位补0;而SAR右移时符号位不动,左边出现的空位补上符号位的值。
其中值得注意的一点是:如果目的操作数是负数,且其中具有1的位数移出后,则SAR指令产生的结果与用整数IDIV指令产生的结果不一样。 例如:-5经SAR右移之后得-3,IDIV之后为-2
5.ROL指令(循环左移) 功能:每执行一次,把最高位移到最低位,同时还把最高位移到CF
6.ROR指令(循环右移) 与ROL指令类似
7.RCL指令(通过进位循环左移) RCL指令对目的操作数1字节或字中的各位循环左移,进位标志CF被看作目的操作数的“一部分”。每执行一次,CF的值循环移入目的操作数的低位,而目的操作数的最高位移入CF。
8.RCR指令(通过进位循环右移) RCR与RCL类似,
比较指令CMP 功能:用第二个操作数去减第一个操作数,并根据所得的差设置有关标志位,为随后的条件转移指令提供条件,但并不保存该差,所以不会改变指令中的操作数。 循环指令 CX寄存器中存放循环次数,一般循环跳转是,CX先减1,后判断CX是否为0 LOOP 标号
相等或为零循环指令 LOOPE/LOOPZ 标号
LOOPNE/LOOPNZ 标号
循环计数器为零转指令
转移指令 1.无条件转移指令JMP 格式:JMP 标号 2.条件转移指令
字符串操作指令 字符串操作指令的实质是对一片连续存储单元进行处理,这片存储单元是隐含指针DS:SI或ES:DI来指定的。 字符串操作指令可对内存单元按字节、字或双字进行处理,并能根据操作对象的字节数使变址寄存器SI和DI增减1、2、4. 具体规定如下: (1)当DF=0时,变址寄存器SI(和DI)增加1、2、4 (2)当DF=1时,变址寄存器SI(和DI)减少1、2、4 实例:字符串输出 方法1:利用40号中断功能,BX=1,CX=输出字符个数,DS:DX指向要输出的串首
方法2:利用9号中断功能。DS:DX指向要输出的串首,一直输出到“$”结束。
字符串输入 方法:利用OAH号中断功能,DS:DX指向存入的首地址。其中,DS:DX内容是输入的最大字节数,是需要事先设置好的;DS:DX+1是实际输入的字节数,是输入成功后的返回值;DS:DX+2是真正的存入的内容首位置。
字符串操作指令
-存字符串数据置零STOS 格式:STOS 内存地址 ;内存地址为目标字符串的目的地址 STOSB/STOSW ;字节/字 功能:STOS指令将累加器AL、AX或EAX的内容传送到由ES:DI所指向的目的串中,同时根据DF和串的类型修改DI以指向下一个串元素。 注意:LODS,STOS指令都不影响状态标志寄存器的状态。
十分重要:
实现一个字符的输入
AH=1
INT 21H
AL=输入的字符
实现一个字符的输出
AH=2
DL=输出的字符
INT 21H
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/127486.html原文链接:https://javaforall.cn