【沧海拾昧】汇编语言:8086/8088常用指令集 |
您所在的位置:网站首页 › 指令书写格式 › 【沧海拾昧】汇编语言:8086/8088常用指令集 |
#C0301 沧海茫茫千钟粟,且拾吾昧一微尘 ——《沧海拾昧集》@CuPhoenix 【阅前敬告】 沧海拾昧集仅做个人学习笔记之用,所述内容不专业不严谨不成体系 如有问题定为本集记录有谬,切勿深究 目录 一、数据传送类 1、通用数据传送指令【MOV】 2、堆栈指令【PUSH/POP】 3、交换指令【XCHG】 4、输入输出指令【IN/OUT】(累加器专用指令) 5、换码指令(查表指令)【XLAT】(累加器专用指令) 6、地址传送指令【LEA/LDS/LES】 7、标志寄存器传送指令【LAHF/SAHF】 二、算术运算类 1、无进位/带进位/增量加法指令【ADD/ADC/INC】 2、无借位/带借位/减量减法指令【SUB/SBB/DEC】 3、求补指令【NEG】 4、比较指令【CMP】 5、无符号/有符号乘法指令【MUL/IMUL】 6、无符号/有符号除法指令【DIV/IDIV】 7、扩展指令【CBW/CWD】 8、非压缩/压缩BCD码加法十进制调整指令【AAA/DAA】 9、非压缩/压缩BCD码减法十进制调整指令【AAS/DAS】 10、非压缩BCD码乘法十进制调整指令【AAM】 11、非压缩BCD码除法十进制调整指令【AAD】 三、逻辑运算与移位指令 1、取反指令【NOT】 2、与/或/异或指令【AND/OR/XOR】 3、测试指令【TEST】 4、算数左移/逻辑左移【SAL/SHL】 5、算数右移【SAR】 6、逻辑右移【SHR】 7、循环移位指令【ROL/ROR/RCL/RCR】 四、转移和控制类指令 1、无条件转移指令【JMP】 2、条件转移指令【J../JN..】 3、循环控制指令【LOOP..】 4、子程序调用和返回指令【CALL/RET】 5、中断指令【INT/INTO/IRET】 6、标志处理指令【PSW.SET/.CLEAR/.COMPLEMENT】 7、处理器暂停指令【HLT】 8、空操作指令【NOP】 一、数据传送类 1、通用数据传送指令【MOV】格式:MOV OPRD1,OPRD2 功能:OPRD2 → OPRD1 允许: ①CPU内部寄存器(除IP、FLAG) → CPU内部寄存器(除CS、IP、FLAG); ②立即数 → CPU内部的通用寄存器组(8个,数据/变址/指针寄存器); ③CPU内部的寄存器(除CS、IP) ↔ 存储器(所有寻址方式); ④立即数 → 存储单元; 禁止: ① mov cs,ax ; CS,IP不能作为目的操作数 ② mov ss,ds ; 段寄存器之间不能直接传送 ③ mov ds,2000h ; 立即数不能直接传送给段寄存器 ④ mov [si],[2000h] ; 内存单元间不能直接传送 ⑤ mov 1000h,ax ; 立即数不能作为目的操作数 2、堆栈指令【PUSH/POP】格式:PUSH OPRD / POP OPRD 功能:OPRD入栈 / 栈顶内容送OPRD 定义堆栈:设 ss=2000h(物理地址20000h),堆栈长度100字,则 sp=0064h(指向栈顶) 入栈操作:先移动sp指针,再压入数据(sp=sp-1,压高字节,sp=sp-1,压低字节) 出栈操作:先弹出数据,再移动sp指针(弹低字节,sp=sp+1,弹高字节,sp=sp+1) 允许: ①仅能对16位数操作,一次压入弹出一个字; ②必须对寄存器的内容或内存单元的内容进行操作; 示例: ① push ah ; 错误,ah是8位数 ② push 2000h ; 错误,不能对立即数操作 ③ push [2000h] ; 正确 3、交换指令【XCHG】格式:XCHG OPRD1,OPRD2 功能:OPRD1与OPRD2内容互换 允许: ①通用寄存器 ↔ 通用寄存器; ②通用寄存器 ↔ 存储器; 禁止: ① 内存单元之间不能直接交换; ② 段寄存器、IP、立即数不能成为操作数; 4、输入输出指令【IN/OUT】(累加器专用指令)格式:IN AL,PORT / IN AX,PORT / OUT PORT,AL / OUT PORT,AX 功能:从PORT口输入数据到AL(AX) / 将AL(AX)中的内容从PORT口输出 允许: ①只能对AL/AX操作,若传送数据为16位,端口地址只能取偶地址; ②端口地址大于8位(0FFH),使用DX间接寻址; 5、换码指令(查表指令)【XLAT】(累加器专用指令)格式:XLAT 功能:(提前对BX,AL赋值)将BX+AL作为偏移地址,取值送入AL中 用途:将累加器AL中的内容变换为存储器表格中的某一个值,常用来实现编码码制的转换 6、地址传送指令【LEA/LDS/LES】格式:LEA OPRD1,OPRD2 功能:将源操作数的偏移地址送到目的操作数中 允许: ①源操作数必须为存储器操作数; ②目的操作数必须为一个16位的通用寄存器; 用途:通常用来使一个寄存器作为地址指针 注:LEA指令与OFFSET伪指令有一定相似之处,可参见《offset与lea区别_百度知道》 格式:LDS/LES OPRD1,OPRD2 功能:将指定内存中的4个字节(32位)分别装入指定的寄存器和段寄存器DS/ES中 允许: ①源操作数必须是寄存器,如DI; ②目的操作数必须是一个地址; 示例: DS:[2130h]=00h,DS:[2131h]=04h,DS:[2132h]=00h,DS:[2133h]=10h [10400H]=0ffh,[10401H]=00h,[10402H]=0aah,[10403H]=00h 执行 lds di,[2130h] ,结果为di=7940h,ds=3024h 再执行 les ax,[di] ,结果为ax=00ffh,es=00aah 7、标志寄存器传送指令【LAHF/SAHF】格式:LAHF / SAHF 功能:将FLAG的低八位装入AH / 将AH的值设为FLAG低八位的值 FLAGSFZF × AF × PF × CFAHD7D6 × D4 × D2 × D0 二、算术运算类![]() 格式:ADD OPRD1, OPRD2 功能:(OPRD1) + (OPRD2) → OPRD1 标志位:影响标志位 格式:ADC OPRD1, OPRD2 功能:(OPRD1) + (OPRD2) + CF → OPRD1 标志位:影响标志位 格式:INC OPRD 功能:(OPRD) + 1 → OPRD 标志位:不影响CF,影响AF,OF,PF,SF和ZF 示例: ① inc [2000h] ; 错误,未指明操作数的类型 ② inc byte ptr [bx] ; 正确,指明了是将[bx]起的字节型进行增量 2、无借位/带借位/减量减法指令【SUB/SBB/DEC】格式:SUB OPRD1, OPRD2 功能:(OPRD1) - (OPRD2) → OPRD1 标志位:影响标志位 格式:SBB OPRD1, OPRD2 功能:(OPRD1) - (OPRD2) - CF → OPRD1 标志位:影响标志位 格式:DEC OPRD 功能:(OPRD) - 1 → OPRD 标志位:不影响CF,影响AF,OF,PF,SF和ZF 3、求补指令【NEG】格式:NEG OPRD 功能:0 – (OPRD) → OPRD 标志位:影响标志位。只有当操作数为0时, CF为0, 否则CF总为1。若操作数为80H或8000H,执行求补指令后,结果没有变化,但OF置1。 4、比较指令【CMP】格式:CMP OPRD1, OPRD2 功能:(OPRD1) - (OPRD2) 标志位:不保存结果,只影响标志位 用法: ①考察ZF标志位的情况判断是否相等,若两者相等,ZF标志为1,否则为0; ②对无符号数: 若结果没有产生借位(CF=0),则AX≥BX;若产生了借位(CF=1),则AX<BX; ③对带符号数: 考察OF与SF异或运算的结果,结果为1,则AX |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |