零散的汇编知识整理

来源:互联网 发布:淘宝老七配件可信吗 编辑:程序博客网 时间:2024/04/29 04:35

汇编知识

  • CS:IP寄存器
  • 8086CPU的寄存器都是16位的,可以存放两个字节,AX,BX,CX,DX这四个寄存器通常用来存放一般的数据,称为通用寄存器
  • CS为代码段寄存器,IP为指令指针寄存器,在8086PC机中,任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存M*16+N单元开始,在8086机中,任何时刻,CPU将CS:IP指向的内容当作指令执行
  • 8086CPU加电启动或复位后CS和IP被设置为CS=FFFFH,IP=0000H。即8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行
  • 8086CPU有一个DS寄存器,通常用来访问数据的段地址,在用内存单元赋值的时候,8086CPU自动取ds中的数据为内存单元地址
  • 8086CPU有两个寄存器,端寄存器SS和寄存器SP,堆栈的端地址存放在SS中,偏移地址存放在SP中,任意时刻,SS:SP指向栈顶元素
  • 8086 CPU 中寄存器总共为 14 个,且均为 16 位 。
    即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES 共 14 个。
    而这 14 个寄存器按照一定方式又分为了通用寄存器,控制寄存器和段寄存器。
    1. 通用寄存器:
      AX,BX,CX,DX 称作为数据寄存器:
      AX (Accumulator):累加寄存器,也称之为累加器;
      BX (Base):基地址寄存器;
      CX (Count):计数器寄存器;
      DX (Data):数据寄存器;
      SP 和 BP 又称作为指针寄存器:
      SP (Stack Pointer):堆栈指针寄存器;
      BP (Base Pointer):基指针寄存器;
      SI 和 DI 又称作为变址寄存器:
      SI (Source Index):源变址寄存器;
      DI (Destination Index):目的变址寄存器;
    2. 控制寄存器:
      IP (Instruction Pointer):指令指针寄存器;
      FLAG:标志寄存器;
    3. 段寄存器:
      CS (Code Segment):代码段寄存器;
      DS (Data Segment):数据段寄存器;
      SS (Stack Segment):堆栈段寄存器;
      ES (Extra Segment):附加段寄存器;

as86汇编语法注解:

  • entry start 表示程序的入口点,声明整个程序是从start开始
  • start: 指明start的位置
  • mov ax,#0xb800 #表示是一个立即数
  • ;!别认为是注释起始符
  • .TEXT .ROM .DATA .BSS设置当前段
  • .GLOBL .GLOBAL .GLOBL .GLOBAL
  • # 立即数的前缀
  • 寄存器

    BP BX DI SI
    EAX EBP EBX ECX EDI EDX ESI ESP
    AX CX DX SP
    AH AL BH BL CH CL DH DL
    CS DS ES FS GS SS
    CR0 CR2 CR3 DR0 DR1 DR2 DR3 DR6 DR7
    TR3 TR4 TR5 TR6 TR7 ST
  • SUB (subtract)
    指令的汇编格式:SUB dst,src
    指令的基本功能:(dst)<-(dst)-(src)

  • 重复执行串 REP
    指令的汇编格式:REP (CX)=重复次数
    指令的基本功能:① (CX)=0时,串指令执行完毕,否则执行② ~ ④
    ② (CX)←(CX)-1 ③ 执行串指令(MOVS或STOS) ④ 重复执行①

  • 自Intel 8086和8088起,有14个16比特寄存器。其中四个(AX, BX, CX, DX)是通用目的(尽管每个寄存器都有附加目的;举个例子:只有CX可以被用来当作loop(循环)指令的计数器。)每个寄存器可以被当成两个分开的字节访问(因此BX的高比特可以被当成BH,低比特则可以当成BL)。除了这些寄存器,还有四个区块寄存器(CS、DS、SS、ES)。他们用来产生内存的绝对地址。还有两个指针寄存器(SP是指向堆栈的底部,BP可以用来指向堆栈或内存的其它地方)。两个指针寄存器(SI和DI)可以用来指向数组的内部。最后,有旗标寄存器(包含状态旗标比如进位、溢出、结果为零,等等)。以及IP是用来指向目前运行指令的地址。
    32位 来源,中文维基(需翻墙)

  • REP与MOVS或STOS串操作指令相结合使用,完成一组字符的传送或建立一组相同数据的字符串. 当cx=0结束

-jmpi Go,INITSEG
jmpi为段间跳转指令
执行这条指令之后
CS = INITSEG,IP = go

  • int 0x13中断向量所指向的中断服务程序实质上就是磁盘服务程序。
    用途:将指定扇区的代码加载到内存的指定位置。
    因此,在使用int 0x13中断时要将参数传递给服务程序:
    例如:将指定扇区和加载的内存位置传递给服务程序
    传递参数的方式:通过几个通用寄存器实现

-BIOS的int 0x13(直接磁盘服务),在该文章中,主要使用的是读扇区的功能,而在直接磁盘服务中功能02H就是读扇区的功能(参考:直接磁盘服务。具体如下:
功能描述:读扇区
入口参数:AH=02H
AL=扇区数
CH=柱面
CL=扇区
DH=磁头
DL=驱动器,00H-7F:软盘;80-0FFH:硬盘
ES:BX=缓冲区的地址
出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码。
参考来源

  • INT 10H 是由 BIOS 对屏幕及显示器所提供的服务程序
    详细说明请见

  • test命令是用来测试指定位上的数是否为0,如果为0,则ax为0,将zf置1,否则置0

  • jne 不等于则跳转,标志位ZF=0
  • cmp指令
  • jb用于比较两个无符号整数时,目标操作数小于源操作数会发生跳转
原创粉丝点击