🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
汇编语言指令大致分为以下几类 > 一、传送类指令 > 二、算数运算类指令 > 三、位操作指令 > 四、串操作指令 > 五、控制转移类指令 > 六、处理器控制类指令 > 七、汇编指令伪指令 * * * * * **一、传送类指令** **1.数据传送指令** **(1) MOV 目的操作数,源操作数** `将源操作数送到目的操作数,目的和源的数的长度要相同,否则会长度不匹配` **(2)XCHG 传送指令** `XCHG 目的操作数,源操作数 //把源和目的操作数交换数值` **2.有效地址传送指令LEA** ~~~ LEA 目的操作数,源操作数 把源操作数的偏移地址送目的操作数, 源操作数必须是一个内存操作数, 目的操作数必须是16位通用寄存器 ~~~ **3.堆栈指针操作指令** 堆栈是一块特殊的存储器区域,这块区域是以先进后出的方式工作,系统为此提供了特殊的指针SP,和段寄存器SS 主要特点是: (1)堆栈是以字方式操作的 **(2)压入堆栈**。 ①先修改指针:`SP=SP -2` ②再存入一个字 **(3)弹出堆栈。** ①先弹出一个字 ②再修改指针:`SP=SP +2` **(4)入栈指令PUSH** 格式:PUSH 操作数 该指令为数据入栈指令 即将操作数指定的一个字节的内容传送至SP所指的栈顶 寻址方式有寄存器寻址(段寄存器SS除外)和存储器寻址, 不能用立即数作操作数。 该指令不影响标志位。 过程: 首先,堆栈`SP=SP-2` 然后,操作数的高位字节——>存入((SP)+1)单元中 操作数的低位字节——>送入(SP) **(5)出栈指令:POP** POP 操作数 将SP所指的栈顶内容传送至操作数指定的一个字。 **寻址方式有:** 寄存器寻址(段寄存器SS除外)和存储器寻址 不能用立即数作操作数。 该指令不影响标志位。 **过程:** 首先堆栈((SP)+1)单元字节——>操作数的高字节位, (SP)单元字节——>操作数的低位字节。 然后`SP=SP-2` **4.输入输出指令** **(1)IN 输入指令** ~~~ IN AL,N ; (N)——>AL IN AX,N ; (N+1:N)——>AX IN AL,63H ; 将端口地址为63H的一个字节内容输入到AL IN AX,55H ;将两个相邻端口地址58H和59H的16位数据输入到AX ~~~ **(2)OUT 输出指令** ~~~ OUT N,AL ;(AL)字节——>N端口地址的单元中 OUT N,AX ;(AX)字——>N+1和N端口地址的单元中 OUT 66H,AL ;将AL内容送端口地址66H的单元中 OUT 66H,AX ;将AX内容送66H和67H端口地址的单元中 ~~~ **!注意:** > 在汇编语言中,端口地址小于256(十六进制00H~FFH)时 > 可以直接在指令中写出端口地址 > 如果端口地址大于256,先将端口地址送入DX寄存器中, > 然后在IN或OUT指令中用DX代表端口地址。 * * * * * **二、算数运算类指令** 参加运算的可以是无符号数或带符号数,带符号的数以补码的形式存放或参与运算 **1.加法指令** **(1)ADD 目的操作数,源操作数** 目的操作数+源操作数——>目的操作数 **(2)ADC带进位的加法指令** ADC 目的操作数,源操作数 目的操作数+源操作数+CF——>目的操作数 **例子:** ~~~ MOV AH,0 ;0——>AH MOV AL,92H ;92H——>AL ADD AL,86H ;92H+86H=18H——>AL,CF=1 ADC AH,0 ;(AH)+0+CF=0+0+1=1——>AH,即01H=AH ~~~ **(3)INC 加|指令** INC 操作数 //操作数加1,结果送操作数 操作数可以是任意一个8或16位的通用寄存器或存储单元,不能是立即数 指令中操作数当作无符号数时,主要用于计数器计数或修改指针地址的值。 如: ~~~ INC DI ;(DI)=DI+1 INC CX ;(CX)=CX+1 ~~~ **说明**:除了指令INC对标志位CF不影响外,其它加法指令对标志位的影响如下 > ①CF:两个数相加,最高有效位有进位时,即字节运算超出无符号输的范围 > 0~255,字运算超出无符号数的范围0~65535时,CF=1,否则CF=0. > 故两个无符号数相加时,可用CF值来判断是否超出了无符号数的表示范围 > 如果CF=1表示此无符号数加法运算结果发生了溢出。 > ②PF:运算结果以二进制数表示时,若"1"的个数为偶数时PF=1,否则PF=0 > ③AF:运算中D3向D4有进位时,AF=1,否则为0 > ④ZF:运算结果为0时,ZF=1;否则ZF=0 > ⑤SF:运算结果最高位为1时,SF=1,否则为0 > ⑥OF:当两个操作数的符号相同,而相加的结果的符号与操作数的符号相反时 > OF=1,否则OF=0。该标志位用来判断带符号数相加的溢出 **例如:** ~~~ ADD AL,30H ;(AH)+30H ——> AL ADD AX,3000H ;(AX)+3000H ——> AX ADD BX,[SI] ;(BX)+((SI))——>BX ~~~ **2.减法指令** **(1)SUB** `SUB 目的操作数,源操作数` 目的操作数=目的操作数-源操作数 **(2)SBB 带错位的减法指令** `SBB 目的操作数,源操作数` 目的操作数=目的操作数-源操作数-CF **(3)DEC 减1指令 格式:DEC 操作数** `DEC DI ;DI=(DI)-1` **(4)NEG 求补指令** ~~~ NEG 操作数 //0-操作数的内容后结果回送操作数 MOV DI,05H NEG DI ;DI=0-(DI)=0-05H=0FBH ~~~ **(5)CMP 比较指令** CMP 目的操作数,源操作数 执行时目的操作数与源操作数相减,只根据结果设置标志位 操作数均保持原值不变 **3.类型扩展指令** 为了解决操作数长度的匹配,有时需要把数据类型进行扩展。 主要有把字节扩展成字,把字扩展成双字 ~~~ CBW:字节扩展成字 CWD:字扩展成双字 ~~~ **例子:** **正数的扩展** ~~~ MOV AL,52H CBW ;执行指令后,AX=0052H CWD ;执行指令后,DX=0000H,AX=0052H ~~~ **负数的扩展** ~~~ MOV AL,86H CBW ;执行指令后,AX=FF86H CWD ;执行指令后,DX=FFFFH,FF86H ~~~ **4.乘法指令** ~~~ MUL :无符号数乘法 IMUL:带符号数乘法 ~~~ 目的操作数必须是累加器,不必在指令中写出。 **例子:** **无符号数乘法** ~~~ MOV AL,05H MOV BL,06H MUL BL //执行结果AX=30=001EH ~~~ **有符号数乘法** ~~~ MOV AL,-5 MOV BL,+6 IMUL BL //AX=-30=FFE2H ~~~ **5.除法指令** **DIV:无符号除法** ~~~ SRC(源操作数)为字节时,AL=AX/SRC的商,AH=AX/SRC的余数 SRC为字时:AX=(DX,AX)/SRC的商,DX=(DX,AX)/SRC的余数 ~~~ 商和余数都是无符号数。 **IDIV:有符号除法** 操作同上类似,目的操作数必须是累加器AX和DX,不必写出。 * * * * * **三、位操作指令** ~~~ AND 与运算. or 或运算. XOR 异或运算. NOT 取反. TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果). SHL 逻辑左移. SAL 算术左移.(=SHL) SHR 逻辑右移. SAR 算术右移.(=SHR) ROL 循环左移. ROR 循环右移. RCL 通过进位的循环左移. RCR 通过进位的循环右移. 以上八种移位指令,其移位次数可达255次. 移位一次时, 可直接用操作码. 如 SHL AX,1. 移位>1次时, 则由寄存器CL给出移位次数. 如 MOV CL,04 SHL AX,CL ~~~ **四、串操作指令** ~~~ DS:SI 源串段寄存器 :源串变址. ES:DI 目标串段寄存器:目标串变址. CX 重复次数计数器. AL/AX 扫描值. D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量. Z标志 用来控制扫描或比较操作的结束. MOVS 串传送. ( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. ) CMPS 串比较. ( CMPSB 比较字符. CMPSW 比较字. ) SCAS 串扫描. 把AL或AX的内容与目标串作比较,比较结果反映在标志位. LODS 装入串. 把源串中的元素(字或字节)逐一装入AL或AX中. ( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. ) STOS 保存串. 是LODS的逆过程. REP 当CX/ECX<>0时重复.,也就是直到CX=0时结束 REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复. REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复. REPC 当CF=1且CX/ECX<>0时重复. REPNC 当CF=0且CX/ECX<>0时重复. ~~~ **五、控制转移类指令** **1>无条件转移指令 (长转移)** ~~~ JMP 无条件转移指令 CALL 过程调用 RET/RETF过程返回. ~~~ **2>条件转移指令 (短转移,-128到+127的距离内)** ~~~ ( 当且仅当(SF XOR OF)=1时,OP1<OP2 ) JA/JNBE 不小于或不等于时转移. JAE/JNB 大于或等于转移. JB/JNAE 小于转移. JBE/JNA 小于或等于转移. 以上四条,测试无符号整数运算的结果(标志C和Z). JG/JNLE 大于转移. JGE/JNL 大于或等于转移. JL/JNGE 小于转移. JLE/JNG 小于或等于转移. 以上四条,测试带符号整数运算的结果(标志S,O和Z). JE/JZ 等于转移. JNE/JNZ 不等于时转移. JC 有进位时转移. JNC 无进位时转移. JNO 不溢出时转移. JNP/JPO 奇偶性为奇数时转移. JNS 符号位为 "0" 时转移. JO 溢出转移. JP/JPE 奇偶性为偶数时转移. JS 符号位为 "1" 时转移. ~~~ **3>循环控制指令(短转移)** ~~~ LOOP CX不为零时循环. LOOPE/LOOPZ CX不为零且标志Z=1时循环. LOOPNE/LOOPNZ CX不为零且标志Z=0时循环. JCXZ CX为零时转移. JECXZ ECX为零时转移. ~~~ **4>中断指令** ~~~ INT 中断指令 INTO 溢出中断 IRET 中断返回 ~~~ **六、处理器控制类指令** 处理器控制类指令只能完成对CPU的简单控制功能。 共有12条 **对标志位操作** ~~~ CLC(进位位置0指令) CMC(进位位求反指令) STC(进位位置为1指令) CLD(方向标志置1指令) STD(方向标志位置1指令) CLI(中断标志置0指令) STI(中断标志置1指令) ~~~ **同步控制** ~~~ WAIT(等待) ESC(交权) LOCK(封锁总线) ~~~ **其他** ~~~ NOP(无操作) HLT(暂停) ~~~ * * * * * **七、汇编指令伪指令** ~~~ DW 定义字(2字节). PROC 定义过程. ENDP 过程结束. SEGMENT 定义段. ASSUME 建立段寄存器寻址. ENDS 段结束. END 程序结束. ~~~ * * * * *