一些比较不常见的 汇编指令记录

汇编指令

demo1

int register_syscall() {
  asm(
    "xor rax, rax;"
    "mov rdx, 0x00200008;"
    "mov ecx, %[msr_star];"
    "wrmsr;"

    "mov eax, %[fmask];"
    "xor rdx, rdx;"
    "mov ecx, %[msr_fmask];"
    "wrmsr;"

    "lea rax, [rip + syscall_entry];"
    "mov rdx, %[base] >> 32;"
    "mov ecx, %[msr_syscall];"
    "wrmsr;"
    :: [msr_star]"i"(MSR_STAR),
       [fmask]"i"(0x3f7fd5), [msr_fmask]"i"(MSR_SYSCALL_MASK),
       [base]"i"(KERNEL_BASE_OFFSET), [msr_syscall]"i"(MSR_LSTAR)
    : "rax", "rdx", "rcx");
  return 0;
}

上面指令中 wrmsr 就比较少见
MSR 是 CPU 的一组64 位寄存器,可以分别通过 RDMSR 和 WRMSR 两条指令进行读和写的操作,前提要在 ECX 中写入 MSR 的地址。MSR 的指令必须执行在 level 0 或实模式下。
RDMSR 读模式定义寄存器。对于RDMSR 指令,将会返回相应的 MSR 中 64bit 信息到(EDX:EAX)寄存器中
WRMSR 写模式定义寄存器。对于 WRMSR 指令,把要写入的信息存入(EDX:EAX)中,执行写指令后,即可将相应的信息存入 ECX 指定的 MSR 中。

  • 补充
    控制和特权指令
    这部分包括无操作指令NOP、停机指令HLT、等待指令WAIT/MWAIT、换码指令ESC、总线封锁指令LOCK、内存范围检查指令BOUND、全局描述符表操作指令LGDT/SGDT、中断描述符表操作指令LIDT/SIDT、局部描述符表操作指令LLDT/SLDT、描述符段界限值加载指令LSR、描述符访问权读取指令LAR、任务寄存器操作指令LTR/STR、请求特权级调整指令ARPL、任务切换标志清零指令CLTS、控制寄存器和调试寄存器数据传送指令MOV、高速缓存控制指令INVD/WBINVD/INVLPG、型号相关寄存器读取和写入指令RDMSR/WRMSR、处理器信息获取指令CPUID、时间戳读取指令RDTSC等

NOP(NO Operation) 无操作指令  该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代.(占位的作用,延时作用)

HLT(halt)停机指令   该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束后可继续执行下面的程序.

WAIT(wait)等待指令  该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回WAIT指令继续德行.

ESC(escape)换码指令  其中mem指出一个存储单元,ESC指令把该存储单元的内容送到数据总线去.当然ESC指令不允许使用立即数和寄存器寻址方式.这条指令在使用协处理机(Coprocessor)执行某些操作时,可从存储器指得指令或操作数.协处理机(如8087)则是为了提高速度而可以选配的硬件.

LOCK(lock)封锁指令  该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止 . 当CPU与其他处理机协同工作时 , 该指令可避免破坏有用信息.

端口是主机与外设进行数据交换的。(外设接口电路有专用于数据交互的寄存器。为了与CPU中的寄存器相区别,称之为“端口”)。端口有数据端口,状态端口和控制端口3种。

PC机给予每一个端口分配了一个地址(称为端口号),形成一个独立于内存空间的I/O地址空间。在8086/8088中,端口地址的范围是0000至FFFF。

CPU对外设的操作通过专门的端口读写指令来完成。读端口用IN指令,写端口用OUT指令。

——————————————————————————————————————————

IN ACC,PORT;从端口PORT读取数据到ACC;

PORT可以是立即数,也可以是DX。

ACC为AL时,从PORT读取1字节数据到AL
ACC为AX时,从PORT读取2字节数据到AX

——————————

OUT PORT,ACC;将ACC的数据写入端口PORT;

——————————

例子:

IN AL,21H;表示从21H端口读取一字节数据到AL

IN AX,21H;表示从端口地址21H读取1字节数据到AL,从端口地址22H读取1字节到AH

MOV DX,379H
IN AL,DX ;从端口379H读取1字节到AL
—————
OUT 21H,AL;将AL的值写入21H端口
OUT 21H,AX;将AX的值写入端口地址21H开始的连续两个字节。(port[21H]=AL,port[22h]=AH)

MOV DX,378H
OUT DX,AX ;将AH和AL分别写入端口379H和378H

一个驱动程序可以同时对应很多设备,但一个设备同时只对应一个驱动程序.

RDTSC - 读取时间标签计数器
操作码 指令 说明
0F 31 RDTSC 将时间标签计数器读入 EDX:EAX

将处理器的时间标签计数器的当前值加载到 EDX:EAX 寄存器。时间标签计数器包含在 64 位 MSR 中。MSR 的高 32 位加载到 EDX 寄存器,低 32 位加载到 EAX 寄存器。处理器每时钟周期递增时间标签计数器 MSR 一次,在处理器复位时将它重设为 0。

寄存器 CR4 中的时间标签禁用 (TSD) 标志限制 RDTSC 的使用。清除 TSD 标志时,RDTSC 指令可以在任何特权级别执行;设置此标志时,指令只能在特权级别 0 执行。在特权级别 0 执行时,时间标签计数器还可以使用 RDMSR 指令读取。

RDTSC 指令不是序列化指令。这样,在读取计数器之前,它没有必要等到前面的所有指令都已执行。类似地,在执行读取操作之前,后面的指令也可以开始执行。

此指令在“英特尔® 体系结构”的奔腾® 处理器中引入。

猜你喜欢

转载自blog.csdn.net/m0_37329910/article/details/85210567