基于8086CPU的汇编学习笔记

本文详细介绍了8086CPU的汇编语言学习,包括寄存器的用途,如CS:IP、DS、SS:SP、CX、BX、SI、DI、ZF等,以及常用汇编指令如MOV、ADD、SUB、JMP、TEST、CMP等的使用,并讲解了条件跳转、栈操作、循环、乘法、串处理和中断处理等概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

寄存器:
    CS:IP寄存器构成了代码地址 CS为代码段寄存器 IP为代码偏移寄存器
    DS 为数据段寄存器
    SS:SP构成栈地址 SS为栈段寄存器 SP为栈偏移寄存器,设置时应接连设置,因为ss传值和sp传值中间的语句不会引起中断
    CX寄存器,通常用在loop循环中,记录循环次数
    BX一般用作偏移地址寄存器
    SI,DI寄存器功能类似于BX,不同点是不能拆分成两个八位寄存器,都用于定位内存地址
    ZF 零标志位 PF 奇偶标志位 SF符号标志位 CF 无符号进位标志位 OF 有符号溢出标志位  DF 方向标志位,在串处理指令中,控制每次操作后,si/di递减或递增
    TF 中断标志位,TF=1则引起单步中断,这实现了编译器的单步调试功能
    IF 屏蔽中断标志位,IF=1则响应中断,IF=0则屏蔽中断
汇编指令 
    MOV 赋值指令 MOV 不能直接给段寄存器赋值,需要通用寄存器中转 通用寄存器 ax,bx,cx,dx等 mov的指令类型是通用数据传送,传送的是数据
    lea 赋值语句 lea的指令类型是目的地址传送,传送的是地址
    add 累加语句 add ax,bx   意思 ax = ax+bx
    sub 减法语句 sub ax,bx 意思 ax = ax-bx
    jmp 跳转语句 后面跟代码地址 CS:IP 只跟IP代表当前段
    test 判等语句,常搭配后面使用 
    CMP 判等语句 仅影响标志位
        cmp ax,bx,执行后
            zf=1,说明(ax)=(bx)
            zf=0,说明(ax)!=(bx)
            cf=1,说明(ax)<(bx)
            cf=0,说明(ax)>=(bx)
            zf=0&&cf=0,说明(ax)>(bx)
            zf=1&&cf=1,说明(ax)<=(bx)    
    条件跳转语句:执行时检测相应的标志寄存器,常搭配test或者cmp使用
        je 相等则执行语句  对应 zf=1
        jne 不相等则执行语句 对应 zf=0
        jb 低于则执行  对应cf=1
        jnb 不低于则执行 对应cf=0
        ja 高于则执行 对应 zf=0&&cf=0
        jna 不高于则执行 对应 zf=1&&cf=1
    push pop 栈操作语句 只进行字操作
    inc ax 自增,ax内容+1
    loop  循环指令,通常,cx寄存器中存放循环次数,循环一次,cx寄存器值减1
    and 按位与 or 按位或
    div 除指令 除数为8或16位,存放在寄存器或者内存单元,被除数存储在ax或者 ax和dx中,除数为8为,则被除数为16位,存在ax中,al保存商,ah存余数,除数为16位,则被除数为32位,ax存商,dx存余数
    jcxz 有条件转移指令 判断cx寄存器值等于0,则跳转
    ret指令用栈中的数据,修改IP的内容,实现近转移 (IP)=((SS)*16+(SP))  (SP)=(SP)+2 转换成汇编语句  pop IP
    retf指令用栈中的数据,修改CS和IP的内容,实现远转移 (IP)=((SS)*16+(SP))  (SP)=(SP)+2 (CS)=((SS)*16+(SP))  (SP)=(SP)+2   pop ip pop cs 
    call指令将ip或者cs和ip数据压入栈中,然后转移  
        call 标号 (sp)=(sp)-2  ((ss)*16+(sp))=(ip) (ip)=(ip)+16 对应汇编  push ip   jmp near ptr 标号
        call far ptr 标号  push cs       push ip      jmp far ptr 标号
        call 寄存器  push ip  jmp 寄存器值
        call word ptr 内存单元地址 push ip   jmp word ptr 内存单元地址
        call dword ptr 内存单元地址 push cs  push ip  jmp dword ptr 内存单元地址
    call + ret 指令实现了方法的调用
    mul指令,乘法指令 
            两个8位相乘,则一个默认在AL中,另一个放在8位寄存器或者内存单元中,结果放在AX中
            两个16位相乘,则一个默认在AX中,另一个放在16位寄存器或者内存单元中,结果高位在DX中,低位在AX中
    adc 进位加法指令 adc a,b 表示 a+b+cf
    sbb 带借位减法指令
    movsb 串传送指令,传送字节 将ds:si指向的内存单元中的字节送入es:di中,此时df=0,则sidi递增,若df=1,sidi递减
    movsw 串传送指令,传送字  将ds:si指向的内存单元中的字送入es:di中,此时df=0,则sidi递增+2,若df=1,sidi递减-2
    rep 根据cx的值,重复执行串传送指令,常搭配movsb和movsw使用,rep movsb,代表s:movsb loops
    cld 指令,将df位置为0
    std 指令,将df位置为1
    pushf 将标志寄存器的值压栈
    popf 将标志寄存器的值弹出
    iret 指令通常和硬件配合完成中断处理过程  中断过程 1.获取中断码N 2.pushf 3.TF=0 IF=0 4.push CS 5.push ip 6.(ip)=(N*4) (cs)=(2+N*4) iret过程:pop ip pop cs popf
    int n指令,调用n号中断处理程序
    shl逻辑左移指令,最后移除位写入cf,缺位补0
    shr逻辑右移指令,最后移除位写入cf,缺位补0
端口指令
    in in al,60h表示从60h端口处读入一个字节,对于0-255端口读写数据的时候,可以直接写数字,对于256-65535端口读写数据的时候,需要用dx寄存器转
    out out 60h,al 表示向60h端口处写入一个字节的数据
 

补充:32位CPU增加

寄存器:

    FS:Flag segment标志段寄存器
    GS:Global segment全局段寄存器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值