汇编语言常用指令汇总

最基础的指令

mov

跳转指令

无符号

JA      ;大于跳转
JAE     ;无符号大于等于则跳转
JB      ;无符号小于则跳转
JNB     ;无符号不小于则跳转
JBE     ;无符号小于等于则跳转
JG      ;有符号大于则跳转
JL      ;有符号小于则跳转
JC      ;CF进位则跳转(无符号为进位)
JO      ;OF溢出则跳转(有符号为溢出)

有符号


运算指令

无符号

ADD     ;+
        ;是否进位看CF
SUB     ;-
        ;是否借位看CF
MUL     ;× 
        ;MOV AL,04H
        ;MOV BL,03H
        ;MUL BL;
        ;(AX:00 0C)
        ;(相当于把MUL后面的去乘AL,结果放在AX里)
        ;(AL与8位相乘,结果存在AX;AX与16位相乘,结果存在DX高和AX低)
        ;运算前乘积高一半为0则OF和CF为0,否则为1
DIV     ;÷
        ;方法同上
        ;DIV后面是被除数,除数默认在
        ;除数是8位,被除数必须是16,被除数保存在AX中:AH保存高8位,AL保存低8位
        ;(接上)计算结果的商保存在AL中,余数保存在AH中。溢出的话CF会置1
        ;除数是16位,被除数必须是32,被除数保存在AX和DX中:DX保存高16位,AX保存低16位
        ;(接上)计算结果的商保存在AX中,余数保存在DX中。
        ;除法指令对所有条件码都没有定义
INC     ;+1,但是不考虑标志位
DEC     ;-1       

有符号

ADC     ;+
        ;是否溢出看OF,=1溢出
SBB     ;-
        ;是否溢出看OF,=1溢出
IMUL    ;×
        ;运算前如果乘积高一半是低一半的符号扩展,则CF和OF为0,否则为1
IDIV    ;÷

移位指令

;移出的那位都移到CF
;只有为CNT=1时,OF才有效,最高有效位辩护=1,否则为0
;后面接着的只能是1或者CL,8086以后才可以有非1的立即数
SHL   ;逻辑左移,补0;无符号数除以2(CNT=1)
SHR   ;逻辑右移,补0;无符号数乘以2(CNT=1)
SAL   ;算术左移,补0;有符号数除以2(CNT=1)
SAR   ;算术右移,补符号位(最高位是啥就还是啥);有符号数乘以2(CNT=1)
ROL   ;循环左移,自己内部循环移
ROR   ;循环右移,自己内部循环移
RCL   ;带进位循环左移,自己内部+CF循环移,最低位补CF
RCR   ;带进位循环右移,自己内部+CF循环移,最高位补CF

其他指令

CBW   ;字节转换为字. (把AL中字节的符号扩展到AH中去) 
      ;MOV AH,01
      ;CBW
      ;此时AX:0001H
      ;MOV AH,-12
      ;CBW
      ;AX:FFF4H
XCHG  ;交换寄存器之间的数值或者寄存器和内存之间的数值
;
CLC    ;CF置0
STC    ;CF置1
NEG    ;求补码
       ;只有0时运算后CF才为0
TEST    ;两个操作数做与(AND)运算,但是不保存结果只根据改变标志位。
        ;一般测试特定位数是否置1,使用JZ进行判断
        

clc ;复位进位标志位 CF<-0
stc ;置位进位标志位 CF<-1
cmc ;求反进位标志位 CF<-~CF
cld ;复位方向标志位 DF<-0 串操作指令中使用
std ;置位方向标志位 DF<-1
cli ;复位中断标志位 IF<-0 用于控制可屏蔽中断的允许和静止
sti ;置位中断标志位 IF<-1
NOP ;空操作,但是占用一个字节存储
————————————————
原文链接:https://blog.csdn.net/qq_44418229/article/details/124510113

非指令

中断

MOV AH 02H
输出DL里的ASCII码
MOV AH,0AH
输入字符串到DX为首地址的内存中
0a中断用法是DS:DX设置接收缓冲区的首地址,在(DS:DX)字节单元中保存缓冲区长度,输入结束后,在(DS:DX+1)字节单元中保存实际输入字符数,回车符不包含在内,输入字符串从DS:DX+2开始。你用100 dup(?) 开辟空间时很有可能(DS:DX)中为0,这样缓冲区长度为0,也就等不到你输入就退出了。
所以 STR DB 12 DUP(0)(或STR DB 12 DUP(?))
LEA DX ,STR
MOV AH,0AH
INT 21H是不行的
数据段应该改成STR DB 12 DUP('$'),'$'
或者补充缓冲区string db 100
db 0
db 100 dup(?)
(待验证(我的猜测):总结一下就是DS:DX的第一个字符不能是0?)

标志位

;FLAGS标志寄存器
;条件码标志
CF    无符号数    进位=1;CY
                无进位=0;NC
OF    有符号数    溢出=1;OV
                无溢出=0;NV
ZF    结果为0         =1;ZR
        不为0         =0;NC
SF    结果为负        =1;NG
         结果为正     =0;PL 
AF    运算的第三位产生进位   =1;AC
否则                        =0;NC
PF      结果1的个数为偶数    =1;PE
为奇数                      =0;PO
DEBUG里标志寄存器状态位英文全称https://www.dandelioncloud.cn/article/details/1560786211306708994
        

一些参考
https://blog.csdn.net/weixin_53798995/article/details/124136560
https://blog.51cto.com/u_15887260/5876766
https://blog.csdn.net/poptar/article/details/111686050

  • 6
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值