翻到了以前的一个程序,关于CPU寄存器验证的。
这段代码有省略的地方,因为我的CPU并不太先进,所以有些就略过了。
这些不只是程序,还是资料可以参考。
[bits 64] ;--------------------- ; CPU 寄存器的验证 ; by 超级蓝果 ;--------------------- ; ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 ; ; vL isqjIi rs rIXjsIk iigviiiiVdii SJJsZLJsV iijvr E U Yi i ; uBBs bQ B B XQ Bi viBqvrJiVqii BRi iBi iQg YUBSi ukiiB iSBB sSjBBkXr iBB BB vB ; KP B B Bid Vv BQv g Ii Qiiii BgiiiBiiiQM viBiu i B Bi Bv dq BBQBB ; sgBi iYiEBi XBr BB iQ B Pr iiiiv iUi iBi iI diZ B ii B Bv uDiurMB ii i i i ; is Bi Bi B ZI Bvg gi vidYiEdEgv vYvPSBuDjvv BiR B ii B JQD dv Qi ; kBiE B B Rrv vQ iBB B B Q B MB B UBv B B B sYvPBs B KBB ; BMBQiikBBQBq ivvsiB Vg vB JB iQ iB Br UQL B RD B B B iB iB uZk gM ; irriiiiii ii i virrrrrirrrr v r r i Ji r ii ; ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 ; IA-32处理器的关键特性 ; 2004 Intel Pentium Processor 755 ; GP:32 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 4GB ; 2006 Intel Core Duo Processor T2600 ; GP:32 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 4GB ; 2008 Intel A_m Processor Z5xx series ; GP:32 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 4GB ;---------------------------------------------------------------------------------------------------- ; Intel 64处理器的关键特性 ; 2004 64-bit Intel Xeon Processor with 800 MHz System Bus ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB ; 2005 64-bit Intel Xeon Processor MP with 8MB L3 ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 1024GB ; 2005 Intel Pentium 4 Processor Extreme Edition Supporting Hyper-Threading Technology ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB ; 2005 Intel Pentium Processor Extreme Edition 840 ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB ; 2005 Dual-Core Intel Xeon Processor 7041 ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB ; 2005 Intel Pentium 4 Processor 672 ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB ; 2006 Intel Pentium Processor Extreme Edition 955 ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB ; 2006 Intel Core 2 Extreme Processor X6800 ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB ; 2006 Intel Xeon Processor 5160 ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB ; 2006 Intel Xeon Processor 7140 ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB ; 2006 Intel Core 2 Extreme Processor QX6700 ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB ; 2006 Quad-core Intel Xeon Processor 5355 ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB ; 2007 Intel Core 2 Duo Processor E6850 ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB ; 2007 Intel Xeon Processor 7350 ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 1024GB ; 2007 Intel Xeon Processor 5472 ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 256GB ; 2008 Intel A_n Processor ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr Up _ 64GB ; 2008 Intel Xeon Processor 7460 ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 1024GB ; 2008 Intel A_n Processor 330 ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr Up _ 64GB ; 2008 Intel Core i7-965 Processor Extreme Edition ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB ; 2010 Intel Core i7-620M Processor ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 64GB ; 2010 Intel Xeon Processor 5680 ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 1TB ; 2010 Intel Xeon Processor 7560 ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 16T ; 2011 Intel Core i7-2600K Processor ; GP:32,64 FPU:80 MMX:64 XMM:128 YMM:256 Max.Ext.Addr 64GB ;++++++ ; 2011 Intel Xeon Processor E3-1280 ; GP:32,64 FPU:80 MMX:64 XMM:128 YMM:256 Max.Ext.Addr 1TB ; 2011 Intel Xeon Processor E7-8870 ; GP:32,64 FPU:80 MMX:64 XMM:128 Max.Ext.Addr 16TB ;------ ;---------------------------------------------------------------------------------------------------- ; 以前IA-32处理器的关键特性 ; 1978 8086 ; 16 GP Ext.Bus 16 Max.Ext.Addr 1MB ; 1982 Intel 286 ; 16 GP Ext.Bus 16 Max.Ext.Addr 16MB ; 1985 Intel 386 DX Processor ; 32 GP Ext.Bus 16 Max.Ext.Addr 4GB ; 1989 Intel 486 DX Processor ; 32 GP 80 FPU Ext.Bus 32 Max.Ext.Addr 4GB ; 1993 Pentium Processor ; 32 GP 80 FPU Ext.Bus 64 Max.Ext.Addr 4GB ; 1995 Pentium Pro Processor ; 32 GP 80 FPU Ext.Bus 64 Max.Ext.Addr 64GB ; 1997 Pentium II Processor ; 32 GP 80 FPU 64 MMX Ext.Bus 64 Max.Ext.Addr 64GB ; 1999 Pentium III Processor ; 32 GP 80 FPU 64 MMX 128 XMM Ext.Bus 64 Max.Ext.Addr 64GB ; 1999 Pentium III and Pentium III Xeon Processors ; 32 GP 80 FPU 64 MMX 128 XMM Ext.Bus 64 Max.Ext.Addr 64GB ; 2000 Pentium 4 Processor ; 32 GP 80 FPU 64 MMX 128 XMM Ext.Bus 64 Max.Ext.Addr 64GB ; 2001 Intel Xeon Processor ; 32 GP 80 FPU 64 MMX 128 XMM Ext.Bus 64 Max.Ext.Addr 64GB ; 2002 Intel Xeon Processor ; 32 GP 80 FPU 64 MMX 128 XMM Ext.Bus 64 Max.Ext.Addr 64GB ; 2003 Pentium M Processor ; 32 GP 80 FPU 64 MMX 128 XMM Ext.Bus 64 Max.Ext.Addr 4GB ; 2004 Intel Pentium 4 Processor Supporing Hyper-Threading Technology at 90 nm Process ; 32 GP 80 FPU 64 MMX 128 XMM Ext.Bus 64 Max.Ext.Addr 64GB ;===================================================================================================== [bits 64] %include 'd:\radasm\nasm\inc\masm32.inc' [extern StdOut] [extern StrLen] [extern printf] [extern ClearScreen] [extern getchar] [extern ExitProcess] ; 指令编码概要 ; Intel 64 和 IA-32 指令说明格式 ; Mod 寄存器模式, Opcode 指令码, SIB 基础索引位移 ;------------------------------------------------------------------------------------ ; 指令附加 指令码 寄存器模组 SIB 地址数 立即数 ;------------------------------------------------------------------------------------ ; 升4位1字节 1-,2-,3-字节 1字节(如真) 1字节(如真) 地址1,2,4字节或无 数值1,2,4字节或无 ; ; ModR/M SIB ; 7 6 5 3 2 0 7 6 5 3 2 0 ;------------------------------------------- ; Mod Reg/Opcode R/M Scale Index Base ;------------------------------------------- ; 表格 REX 前缀段[位:0100WRXB] ; ; REX 寄存器位 ; ; 段名 位 定义 ;======================================================= ; - 7:4 0100 ; W 3 0 = CS.D 操作数尺寸 ; 1 = 64位操作尺寸 ; R 2 扩展 ModR/M 寄存器段 ; X 1 扩展 SIB 索引段 ; B 0 扩展 ModR/M r/m 段,SIB基本段,指令码寄存器段 ; 内存地址没用SIB字节;REX.X 没使用 ;---------------------------------------------------- ; ModRM Byte ; REX PREFIX Opcode mod reg r/m ; 01000WR0B <>11 rrr bbb ; ; Rrrr Bbbb ; 内存地址使用SIB字节 ;----------------------------------------------------- ; ModRM Byte SIB Byte ; REX PREFIX Opcode mod reg r/m scale index base ; 01000WRXB <>11 rrr 100 ss xxx bbb ; ; Rrrr Xxxx Bbbb ; 寄存器操作码在指令码中;REX.X & REX.R没使用 ;----------------------------------------------------- ; ; REX PREFIX Opcode mod reg ; 01000W00B <>11 bbb ; ; Bbbb ;----------------------------------------------------- ; 指定多选REX加码 ; ModR/M or SIB 子加码 完全操作模式 完全立即模式 附要 ;------------------------------------------------------------------------------------ ; ModR/M 字节 mod <> 11 SIB字节 SIB字节ESP基址 REX附加40位不解码 ; r/m == b*100(ESP) SIB在R12基地上也正确 ;------------------------------------------------------------------------------------ ; ModR/M 字节 mod == 0 基寄存器没用 非EBP必用 REX附加40位不解码 ; r/m == b*101(EBP) mod = 01 用RBP或R13,非其它 ; 必须 mod = 01,其它为0 ;------------------------------------------------------------------------------------ ; SIB 字节 索引 == 0100(ESP) ESP不能用于 REX附加40位不解码 ; 索引寄存器 扩展索引 RSP在R12 ; R12能用于索引 ;------------------------------------------------------------------------------------ ; SIB 字节 基础 == 0101(EBP) 基寄存器在mod加码 REX附加40位不解码 ; 被用于 EBP/RBP或R13 ; 注:不考虑REX.B的值 ; 例: 48 B8 8877665544332211 MOV RAX,1122334455667788H ; 内存段选 ; 15 0 31 0 ; ---------- --------------------- ; | 段选 | | 偏移(或直接地址)| ; ---------- --------------------- ; 64位模式内存段选 ; 15 0 63 0 ; ---------- --------------------- ; | 段选 | | 偏移(或直接地址)| ; ---------- --------------------- [section .data] n_16 db 0ffh,0ffh n_32 db 0ffh,0ffh,0ffh,0ffh n_64 db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh n_128 db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh n_256 dq 0ffffffffffffffffh,0ffffffffffffffffh,0ffffffffffffffffh,0ffffffffffffffffh n_512 dq 0ffffffffffffffffh,0ffffffffffffffffh,0ffffffffffffffffh,0ffffffffffffffffh dq 0ffffffffffffffffh,0ffffffffffffffffh,0ffffffffffffffffh,0ffffffffffffffffh To_8086 db '8位寄存器',0dh,0ah db '---------------------------------------------------------------',0dh,0ah,0 ; rex.r = 0 _al db 'AL = %X',0dh,0ah,0 ;reg 段 0 _cl db 'CL = %X',0dh,0ah,0 ;reg 段 1 _dl db 'DL = %X',0dh,0ah,0 ;reg 段 2 _bl db 'BL = %X',0dh,0ah,0 ;reg 段 3 ; 没有 rex _ah db 'AH = %X',0dh,0ah,0 ;reg 段 4 _ch db 'CH = %X',0dh,0ah,0 ;reg 段 5 _dh db 'DH = %X',0dh,0ah,0 ;reg 段 6 _bh db 'BH = %X',0dh,0ah,0 ;reg 段 7 ; 任何 rex _spl db 'SPL = %X',0dh,0ah,0 ;reg 段 4 _bpl db 'BPL = %X',0dh,0ah,0 ;reg 段 5 _sil db 'SIL = %X',0dh,0ah,0 ;reg 段 6 _dil db 'DIL = %X',0dh,0ah,0 ;reg 段 7 ; 仅用于64位模式 rex.r=1 的 R8-R15 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< _r8l db 'R8L = %X',0dh,0ah,0 ;reg 段 0 _r9l db 'R9L = %X',0dh,0ah,0 ;reg 段 1 _r10l db 'R10L = %X',0dh,0ah,0 ;reg 段 2 _r11l db 'R11L = %X',0dh,0ah,0 ;reg 段 3 _r12l db 'R12L = %X',0dh,0ah,0 ;reg 段 4 _r13l db 'R13L = %X',0dh,0ah,0 ;reg 段 5 _r14l db 'R14L = %X',0dh,0ah,0 ;reg 段 6 _r15l db 'R15L = %X',0dh,0ah,0 ;reg 段 7 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 和_r8l-_r15l 一样的 _r8b db 'R8B = %X',0dh,0ah,0 ;reg 段 0 _r9b db 'R9B = %X',0dh,0ah,0 ;reg 段 1 _r10b db 'R10B = %X',0dh,0ah,0 ;reg 段 2 _r11b db 'R11B = %X',0dh,0ah,0 ;reg 段 3 _r12b db 'R12B = %X',0dh,0ah,0 ;reg 段 4 _r13b db 'R13B = %X',0dh,0ah,0 ;reg 段 5 _r14b db 'R14B = %X',0dh,0ah,0 ;reg 段 6 _r15b db 'R15B = %X',0dh,0ah,0 ;reg 段 7 To_286 db '16位 寄存器',0dh,0ah db '---------------------------------------------------------------',0dh,0ah,0 _ax db 'AX = %X',0dh,0ah,0 ;reg 段 0 _cx db 'CX = %X',0dh,0ah,0 ;reg 段 1 _dx db 'DX = %X',0dh,0ah,0 ;reg 段 2 _bx db 'BX = %X',0dh,0ah,0 ;reg 段 3 ; rex.r = 0 _sp db 'SP = %X',0dh,0ah,0 ;reg 段 4 _bp db 'BP = %X',0dh,0ah,0 ;reg 段 5 _si db 'SI = %X',0dh,0ah,0 ;reg 段 6 _di db 'DI = %X',0dh,0ah,0 ;reg 段 7 _ip db 'IP = %X',0dh,0ah,0 ; 仅用于64位模式 rex.r=1 的 R8-R15 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< _r8w db 'R8w = %X',0dh,0ah,0 ;reg 段 0 _r9w db 'R9w = %X',0dh,0ah,0 ;reg 段 1 _r10w db 'R10w = %X',0dh,0ah,0 ;reg 段 2 _r11w db 'R11w = %X',0dh,0ah,0 ;reg 段 3 _r12w db 'R12w = %X',0dh,0ah,0 ;reg 段 4 _r13w db 'R13w = %X',0dh,0ah,0 ;reg 段 5 _r14w db 'R14w = %X',0dh,0ah,0 ;reg 段 6 _r15w db 'R15w = %X',0dh,0ah,0 ;reg 段 7 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;--------------------------------------------------------------------------------------- To_386 db '32位 寄存器',0dh,0ah db '---------------------------------------------------------------',0dh,0ah,0 _eax db 'EAX = %X',0dh,0ah,0 ;reg 段 0 _ecx db 'ECX = %X',0dh,0ah,0 ;reg 段 1 _edx db 'EDX = %X',0dh,0ah,0 ;reg 段 2 _ebx db 'EBX = %X',0dh,0ah,0 ;reg 段 3 ; rex.r = 0 _esp db 'ESP = %X',0dh,0ah,0 ;reg 段 4 _ebp db 'EBP = %X',0dh,0ah,0 ;reg 段 5 _esi db 'ESI = %X',0dh,0ah,0 ;reg 段 6 _edi db 'EDI = %X',0dh,0ah,0 ;reg 段 7 ; 32位 寄存器 ; EFLAGS 寄存器 ; 比较位单元 ;|<-------------------------------- PUSHFD/POPFD ------------------------------->| ;| |<-------- PUSHF/POPF -------->| ; 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ;--------------------------------------------------------------------------------------- ; 0 0 0 0 0 0 0 0 0 0 I V V A V R 0 N | I | O D I T S Z 0 A 0 P 1 C ; D I I C M F T | O -| F F F F F F F F F ; P F | P | ; | L | ;--------------------------------------------------------------------------------------- ; X ID 标志 (ID) ; X 虚拟中断 (VIP) ; X 虚拟中断标志(VIF) ; X 对齐检查/访问控制(AC) ; X 虚8086模式(VM) ; X 挂起标志(RF) ; X 任务 (NT) ; X I/O 环级(IOPL) ; S 溢出标志(OF) ; C 连接标志(DF) ; X 开中断标志(IF) ; X 跟踪标志(TF) ; S 符号标志(SF) ; S 零标志(ZF) ; S BCD进位标志(AF) ; S 局部标志(PF) ; S 进位标志(CF) ; S 结构标志 ; C 控制标志 ; X 系统标志 ; 0 没有使用这个值 _eflags db 'EFLAGS = %X',0dh,0ah,0 _eip db 'EIP = %X',0dh,0ah,0 ;仅用于64位模式 rex.r=1 的 R8-R15 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< _r8d db 'R8d = %X',0dh,0ah,0 ;reg 段 0 _r9d db 'R9d = %X',0dh,0ah,0 ;reg 段 1 _r10d db 'R10d = %X',0dh,0ah,0 ;reg 段 2 _r11d db 'R11d = %X',0dh,0ah,0 ;reg 段 3 _r12d db 'R12d = %X',0dh,0ah,0 ;reg 段 4 _r13d db 'R13d = %X',0dh,0ah,0 ;reg 段 5 _r14d db 'R14d = %X',0dh,0ah,0 ;reg 段 6 _r15d db 'R15d = %X',0dh,0ah,0 ;reg 段 7 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> To_ia64 db '64位 寄存器',0dh,0ah db '---------------------------------------------------------------',0dh,0ah,0 _rax db 'RAX = %X',0dh,0ah,0 ;reg 段 0 _rcx db 'RCX = %X',0dh,0ah,0 ;reg 段 1 _rdx db 'RDX = %X',0dh,0ah,0 ;reg 段 2 _rbx db 'RBX = %X',0dh,0ah,0 ;reg 段 3 ; rex.r = 0 _rsp db 'RSP = %X',0dh,0ah,0 ;reg 段 4 _rbp db 'RBP = %X',0dh,0ah,0 ;reg 段 5 _rsi db 'RSI = %X',0dh,0ah,0 ;reg 段 6 _rdi db 'RDI = %X',0dh,0ah,0 ;reg 段 7 _rflags db 'RFLAGS = %X',0dh,0ah,0 ; 在64位模式,RIP地址使用32位数计算下一指令,扩展值加到64位RIP值 _rip db 'RIP = %X',0dh,0ah,0 ;x87 FPU 数据寄存器 ;符号79 扩充78-64 数值63-0 ;控制寄存器15-0 过去指令指针47-0(FCS:FIP) ;结构寄存器15-0 过去数据指针47-0(FDS:FDP) ;标记寄存器15-0 指令码10-0 ; FPU 数据寄存器堆栈 ;------------------------------------------------- ; 堆栈 7 ; | 6 ; | 5 ST(2) ; | 4 ST(1) 顶部 ; V 3 ST(0) <- |011b| ; 2 ; 1 ; 0 ; 例子: ; 计算 (5.6 * 2.4) + (3.8 * 10.3) ; 代码: ; fld value1 ;(a) value1 = 5.6 ; fmul value2 ;(b) value2 = 2.4 ; fld value3 ; value3 = 3.8 ; fmul value4 ;(c) value4 = 10.3 ; fadd st(1) ;(d) ; ; (a) (b) (c) (d) ; ------------ ------------- ------------- -------------- ; R7 R7 R7 R7 ; R6 R6 R6 R6 ; R5 R5 R5 R5 ; R4 5.6 ST(0) R4 13.44 ST(0) R4 13.44 ST(1) R4 13.44 ST(1) ; R3 R3 R3 39.14 ST(0) R3 52.58 ST(0) ; R2 R2 R2 R2 ; R1 R1 R1 R1 ; R0 R0 R0 R0 ; ------------ -------------- -------------- -------------- ;x87 FPU 结构寄存器 ; -------------- FPU 忙 ; | v------ 栈顶指针 ; 15 14 13 11 10 9 8 7 6 5 4 3 2 1 0 ; ------------------------------------ ; |B| C| _P | C|C|C|E|S|P|U|O|Z|D|I| ; | | 3| | 2|1|0|S|F|E|E|E|E|E|E| ; ------------------------------------ ; | | | | | | | | | | | | ; 代码---------------- | | | | | | | | ; 异常结构-------------- | | | | | | | ; 堆栈特质---------------- | | | | | | ; 异常标志------------------ | | | | | ; 精度 ---------------------- | | | | ; 溢出 ------------------------ | | | ; 零除 -------------------------- | | ; 数据操作 ------------------------ | ; 错误操作 -------------------------- ;x87 FPU 控制字 ; ---------------- 初控制 ; | ------------ 环控制 ; | | | v------ 精度控制 ; 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ; -------------------------------------- ; | | | | X| RC | PC| | |P|U|O|Z|D|I| ; | | | | | | | | |M|M|M|M|M|M| ; -------------------------------------- ; | | | | | | ; | | | | | | ; | | | | | | ; | | | | | | ; 异常屏蔽 | | | | | | ; 精度 ---------------------- | | | | | ; 未明 ------------------------ | | | | ; 溢出 -------------------------- | | | ; 零除 ---------------------------- | | ; 数据操作 -------------------------- | ; 错误操作 ---------------------------- ; ; x87 FPU 初始化指令 finit/fninit 或 fsave/fnsave,初始值为 037fh ; 作用:屏蔽所有浮点异常,设置近环和设置FPU为64位精度 ; ; 精度控制段 (PC) ; ---------------------- ; 精度 | PC段 ; ----------------+----- ; 单精度 (24位) | 00b ; 保留 | 01b ; 双精度 (53位) | 10b ; 双精度扩展(64位)| 11b ; ---------------------- ; 环模式编码控制段(RC) ; ---------------------- ; 环模式|RC设置|描述 ; ------+------+-------- ; 近环 | 00b | ; 下环 | 01b | ; 上环 | 10b | ; 零塔环| 11b | ; ---------------------- _r0 db 'R8 = %X',0dh,0ah,0 ;reg 段 0 _r1 db 'R9 = %X',0dh,0ah,0 ;reg 段 1 _r2 db 'R10 = %X',0dh,0ah,0 ;reg 段 2 _r3 db 'R11 = %X',0dh,0ah,0 ;reg 段 3 _r4 db 'R12 = %X',0dh,0ah,0 ;reg 段 4 _r5 db 'R13 = %X',0dh,0ah,0 ;reg 段 5 _r6 db 'R14 = %X',0dh,0ah,0 ;reg 段 6 _r7 db 'R15 = %X',0dh,0ah,0 ;reg 段 7 ; 仅用于64位模式 rex.r=1 的 R8-R15 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< _r8 db 'R8 = %X',0dh,0ah,0 ;reg 段 0 _r9 db 'R9 = %X',0dh,0ah,0 ;reg 段 1 _r10 db 'R10 = %X',0dh,0ah,0 ;reg 段 2 _r11 db 'R11 = %X',0dh,0ah,0 ;reg 段 3 _r12 db 'R12 = %X',0dh,0ah,0 ;reg 段 4 _r13 db 'R13 = %X',0dh,0ah,0 ;reg 段 5 _r14 db 'R14 = %X',0dh,0ah,0 ;reg 段 6 _r15 db 'R15 = %X',0dh,0ah,0 ;reg 段 7 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> _lip db 'LIP = %X',0dh,0ah,0 ; 使用RS_RSSP 和SAVEPREVSSP指令操作影子栈在64位格式值上 ; 例:SSP = 1000h 新影子栈 地址 3ff8h,出影子栈后为 4000h, 1000h成为旧的SSP值 _ssp db 'SSP = %X',0dh,0ah,0 To_16f db '16位 段寄存器',0dh,0ah db '---------------------------------------------------------------',0dh,0ah,0 _cs db 'CS = %X',0dh,0ah,0 _ds db 'DS = %X',0dh,0ah,0 _es db 'ES = %X',0dh,0ah,0 _ss db 'SS = %X',0dh,0ah,0 _fs db 'FS = %X',0dh,0ah,0 _gs db 'GS = %X',0dh,0ah,0 ; MS-DOS 完全模式浮点寄存器 ; CR0.NE[5位]设1,主模式有异常,异常段ES标志进fpu单元,标符#MF ; 如 IGNNE#位脚不能访问那访问 FERR#位脚, 当 FERR#位脚访问或延时有个异常 ; 可屏敝x87 fpu 单元,异常后进入MMX单元 ; FERR#脚连接 可用 IRQ13中断,当 FERR#脚 被访问时 调用中断75h ; BIOS 的中断75h被NMI中断2设置使用 ; IGNNE#位脚访问中止浮点错有一个异常 ; 在软件中一个 wait/fwait 指令等待 iret 指令处理返回 ; 不支持MMX指令cr0.em[2位]为0,异常(#UD) ; 例: ; ... ; ... ; mov eax,1 ; cpuid ; test edx,00800000h ;EDX中23位设为1了吗? ; jnz ; ... _st0 db 'ST(0) = %X',0dh,0ah,0 _st1 db 'ST(1) = %X',0dh,0ah,0 _st2 db 'ST(2) = %X',0dh,0ah,0 _st3 db 'ST(3) = %X',0dh,0ah,0 _st4 db 'ST(4) = %X',0dh,0ah,0 _st5 db 'ST(5) = %X',0dh,0ah,0 _st6 db 'ST(6) = %X',0dh,0ah,0 _st7 db 'ST(7) = %X',0dh,0ah,0 ;------------------------------------------ ; ; fpu 和 MMX 两者之间的转换 ; fpu 入点为00b,MMX寄存器为11b,可从64位到79位 ; 早点的在MMX中的fpu结果会丢失 ; fpu 中的_S栈顶设置0 ; 使用FSAVE和FXSAVE 保存 fpu 入点结构 ; EMMS指令可从x87换到MMX结构 ; MMX 寄存器 ; 64位 数据类型 ; EMMS单元 ;;;;;;;; 扩展CPUID指令,测试支持,不识别异常(#UD) ; ; MMX 指令可用于 ; 数据转换 ; 计算 ; 比较 ; 复盖 ; 解包 ; 逻辑 ; 位移 ; EMMS (入点使用时11b,一般值为00b) ;-------------------------------------------------------- ; 注:用CPUID 01功能测试可用性! EDX.MMX [23位],设置0失效 ; 开放MMX技术可用 EAX,EBX,等寄存器,MMX可用于64位结构体数据 ; 在多任务操作系统环境中要保存和恢复MMX的设置结构 ; 异常于执行浮点指令,内存超围,计算,int 16 辅助测试FERR#位脚 ; 补:(扩展,没有必要了解) ; 机器码前缀 067h 内存操作 ; 机器码前缀 0f0h 非法指令异常 (#UD) ; 机器码前缀 0f3h,0f2h,066h 不明结果,保留 ; 机器码前缀 02eh,036h,03eh,026h,064h,065h,内存操作和未明结果 ; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; SSE SIMD 扩展 _mmx0 db 'MMX0 = %X',0dh,0ah,0 _mmx1 db 'MMX1 = %X',0dh,0ah,0 _mmx2 db 'MMX2 = %X',0dh,0ah,0 _mmx3 db 'MMX3 = %X',0dh,0ah,0 _mmx4 db 'MMX4 = %X',0dh,0ah,0 _mmx5 db 'MMX5 = %X',0dh,0ah,0 _mmx6 db 'MMX6 = %X',0dh,0ah,0 _mmx7 db 'MMX7 = %X',0dh,0ah,0 ; XMM 寄存器 ; 128位 数据类型 ; SSE 扩展 cpuid.01h:edx.sse[25位]为1可用 ; 128位数据寄存器 调用xmm寄存器于非64位模式,16个XMM寄存器可用于64位模式 ; 32位的 MXCSR寄存器私控结构位用于XMM寄存器 ; 128位包数据用于浮点数据类型,双精四字值 ; mmx和xmm低位复用,使用MXCSR寄存器保存和恢复 ; 数值支持指令和数据 ; 扩展到cpuid指令 ; 32位值时,分四个数据包加强媒体和通讯和大数等 ; 大数组可用于浮点值和整型数据 ; 高冲缓存数据流可进入MMX和出入MMX寄存器保存和测试 ; SFENCE 排序保存私用控制内存类型 ; 检测SSE 扩展后可用于,虚86模式,实模式,保护模式和所有IA-32执行模式 _xmm0 db 'XMM0 = %X',0dh,0ah,0 _xmm1 db 'XMM1 = %X',0dh,0ah,0 _xmm2 db 'XMM2 = %X',0dh,0ah,0 _xmm3 db 'XMM3 = %X',0dh,0ah,0 _xmm4 db 'XMM4 = %X',0dh,0ah,0 _xmm5 db 'XMM5 = %X',0dh,0ah,0 _xmm6 db 'XMM6 = %X',0dh,0ah,0 _xmm7 db 'XMM7 = %X',0dh,0ah,0 ; 32位 寄存器 ; 复位初始化值 1f80h ; SIMD浮点单元(简单指令多段数据执行模式) ; 标志和屏蔽SSE,SSE2,SSE3 SIMD 结构和控制信息的异常 ; 控制SIMD操作 ; 压入和释放0标志为SIMD私有的浮点操作控制 ; 用 STMXCSR 和STMXCSR 和 FXRS_R 和 FXSAVE 从内存中保存和读取到寄存器 ; 16位到31位保留位不为空值,使用保存和读取指令 FXRS_R,LDMXCSR指令会有个常规(#GP)保护异常 ;;;;;;;;;;;;;; MXCSR的DAZ标志位检查支持 ; 128位 SIMD 数据例子: ;1: ; ... ; movaps xmm0,[eax] ;单浮点 ; movaps xmm1,[ebx] ; addpd xmm0,xmm1 ; ... ;2: ; ... ; movapd xmm0,[eax] ;双浮点 ; movaps xmm1,[ebx] ; xorpd xmm0,xmm1 ; ... ;MXCSR 控制/结构寄存器 ; 31 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ; ------------------------------------------------------------------------------ ; | | F| R | P| U| O|Z|D|I|D|P|U|O|Z|D|I| ; | 保留 | T| C | M| M| M|M|M|M|A|E|E|E|E|E|E| ; | | Z| | | | | | | |Z| | | | | | | ; ------------------------------------------------------------------------------ ; | | | | | | | | | | | | | | | ; 压入零代码------------------------------- | | | | | | | | | | | | | | ; 环控制 ------------------------------------ | | | | | | | | | | | | | ; 精度屏蔽 ----------------------------------------- | | | | | | | | | | | | ; 未明屏蔽 -------------------------------------------- | | | | | | | | | | | ; 溢出屏蔽 ----------------------------------------------- | | | | | | | | | | ; 除零屏蔽 ------------------------------------------------- | | | | | | | | | ; 零数值屏蔽--------------------------------------------------- | | | | | | | | ; 错误操作数----------------------------------------------------- | | | | | | | ; 零数值区 ------------------------------------------------------- | | | | | | ; 精度标志 --------------------------------------------------------- | | | | | ; 未明标志 ----------------------------------------------------------- | | | | ; 溢出标志 ------------------------------------------------------------- | | | ; 零除标志 --------------------------------------------------------------- | | ; 数值标志 ----------------------------------------------------------------- | ; 错误操作标志 ---------------------------------------------------------------- _mxcsr db 'MXCSR = %X',0dh,0ah,0 _cr0 db 'CR0 = %X',0dh,0ah,0 _cr2 db 'CR2 = %X',0dh,0ah,0 _cr3 db 'CR3 = %X',0dh,0ah,0 _cr4 db 'CR4 = %X',0dh,0ah,0 _gdtr db 'GDTR = %X',0dh,0ah,0 _ldtr db 'LDTR = %X',0dh,0ah,0 _idtr db 'IDTR = %X',0dh,0ah,0 _dr0 db 'DR0 = %X',0dh,0ah,0 _dr1 db 'DR1 = %X',0dh,0ah,0 _dr2 db 'DR2 = %X',0dh,0ah,0 _dr3 db 'DR3 = %X',0dh,0ah,0 _dr6 db 'DR6 = %X',0dh,0ah,0 _dr7 db 'DR7 = %X',0dh,0ah,0 _msr db 'MSR = %X',0dh,0ah,0 ;在IA-32e 模式 CR9-CR15和 DR8-DR15 没立即数会有指令异常(#UD) _cr8 db 'CR8 = %X',0dh,0ah,0 ;在64位模式 CR8是私有任务寄存器(TPR) ;......................................... _cr9 db 'CR9 = %X',0dh,0ah,0 _cr10 db 'CR10 = %X',0dh,0ah,0 _cr11 db 'CR11 = %X',0dh,0ah,0 _cr12 db 'CR12 = %X',0dh,0ah,0 _cr13 db 'CR13 = %X',0dh,0ah,0 _cr14 db 'CR14 = %X',0dh,0ah,0 _cr15 db 'CR15 = %X',0dh,0ah,0 ; 调试寄存器 _dr8 db 'DR8 = %X',0dh,0ah,0 _dr9 db 'DR9 = %X',0dh,0ah,0 _dr10 db 'DR10 = %X',0dh,0ah,0 _dr11 db 'DR11 = %X',0dh,0ah,0 _dr12 db 'DR12 = %X',0dh,0ah,0 _dr13 db 'DR13 = %X',0dh,0ah,0 _dr14 db 'DR14 = %X',0dh,0ah,0 _dr15 db 'DR15 = %X',0dh,0ah,0 ;----------------------------------------------------------------------- ; 128位 数据类型 ; SSE 64位模式和完全模式 (SSE扩展) ; SSE2 SSE3/SSSE3 程序环境 ; CPUID.01h:EDX.SSE2 [26位]为1 支持SSE2扩展为128位数据处理 ; cr4.osfxsr[9位]和cr4.osxmmexcpt[10位]被操作系统设置后可跳过指令FXSAVE ; 和FXRS_R指令和SIMD浮点异常 ; LFENCE,MFENCE,SFENCE 用PASUE指令等待一个超级wait循环 ; 用于 数据移动 ; 数学指令计算 ; 逻辑指令计算 ; 比较指令计算 ; 位移指令计算 ; 复盖指令 ; SSE扩展 64位SIMD整型指令可用XMM寄存器寻址128位内存 ; 注: cpuid.01h:edx.fxsr[24位]为1 支持FXSAVE和FXRS_R指令 ; FNSAVE,FSAVE指令 ; 补: ; PREFETCHT0 取高速缓存临时数据 ; PREFETCHT1 取高速缓存级别2数据 ; PREFETCHT2 取高速缓存级别2数据 ; PREFETCHTA 取最小高速缓存数据 ; 前缀 2eh,3eh 隐含私有测试开发,用于跳转和级别指令 ; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; XMM8-XMM15 用REX.R 进入64位模式使用 _xmm8 db 'XMM8 = %X',0dh,0ah,0 _xmm9 db 'XMM9 = %X',0dh,0ah,0 _xmm10 db 'XMM10 = %X',0dh,0ah,0 _xmm11 db 'XMM11 = %X',0dh,0ah,0 _xmm12 db 'XMM12 = %X',0dh,0ah,0 _xmm13 db 'XMM13 = %X',0dh,0ah,0 _xmm14 db 'XMM14 = %X',0dh,0ah,0 _xmm15 db 'XMM15 = %X',0dh,0ah,0 ; 256位 YMM 寄存器 _ymm0 db 'YMM0 = %X',0dh,0ah,0 _ymm1 db 'YMM1 = %X',0dh,0ah,0 _ymm2 db 'YMM2 = %X',0dh,0ah,0 _ymm3 db 'YMM3 = %X',0dh,0ah,0 _ymm4 db 'YMM4 = %X',0dh,0ah,0 _ymm5 db 'YMM5 = %X',0dh,0ah,0 _ymm6 db 'YMM6 = %X',0dh,0ah,0 _ymm7 db 'YMM7 = %X',0dh,0ah,0 ; YMM8-YMM15 进入64位模式使用 _ymm8 db 'YMM8 = %X',0dh,0ah,0 _ymm9 db 'YMM9 = %X',0dh,0ah,0 _ymm10 db 'YMM10 = %X',0dh,0ah,0 _ymm11 db 'YMM11 = %X',0dh,0ah,0 _ymm12 db 'YMM12 = %X',0dh,0ah,0 _ymm13 db 'YMM13 = %X',0dh,0ah,0 _ymm14 db 'YMM14 = %X',0dh,0ah,0 _ymm15 db 'YMM15 = %X',0dh,0ah,0 ; 256位 YMM 寄存器 _ymm0_h db 'YMM0 = %X',0dh,0ah,0 _ymm1_h db 'YMM1 = %X',0dh,0ah,0 _ymm2_h db 'YMM2 = %X',0dh,0ah,0 _ymm3_h db 'YMM3 = %X',0dh,0ah,0 _ymm4_h db 'YMM4 = %X',0dh,0ah,0 _ymm5_h db 'YMM5 = %X',0dh,0ah,0 _ymm6_h db 'YMM6 = %X',0dh,0ah,0 _ymm7_h db 'YMM7 = %X',0dh,0ah,0 ; 64位字模式 ; YMM8-YMM15 进入64位模式使用 _ymm8_h db 'YMM8 = %X',0dh,0ah,0 _ymm9_h db 'YMM9 = %X',0dh,0ah,0 _ymm10_h db 'YMM10 = %X',0dh,0ah,0 _ymm11_h db 'YMM11 = %X',0dh,0ah,0 _ymm12_h db 'YMM12 = %X',0dh,0ah,0 _ymm13_h db 'YMM13 = %X',0dh,0ah,0 _ymm14_h db 'YMM14 = %X',0dh,0ah,0 _ymm15_h db 'YMM15 = %X',0dh,0ah,0 ; RDX:RAX 128位操作 ; INTEL AVX 指令 VEX 附加前缀 ; VEX.vvvv ; R8/R8d - R15/R15d 传统/完全32位模式不可用 ; XMM0/YMM0 - XMM7/YMM7 传统/完全32位模式可用 ; XMM8/YMM8 - XMM15/YMM15 传统/完全32位模式不可用 ; INTEL AVX-512 编码 ; EVEX ;================================================================================ ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; 512位 ZMM 寄存器 新寄存器 _zmm0 db 'ZMM0 = %X',0dh,0ah,0 _zmm1 db 'ZMM1 = %X',0dh,0ah,0 _zmm2 db 'ZMM2 = %X',0dh,0ah,0 _zmm3 db 'ZMM3 = %X',0dh,0ah,0 _zmm4 db 'ZMM4 = %X',0dh,0ah,0 _zmm5 db 'ZMM5 = %X',0dh,0ah,0 _zmm6 db 'ZMM6 = %X',0dh,0ah,0 _zmm7 db 'ZMM7 = %X',0dh,0ah,0 ; _zmm8 db 'ZMM8 = %X',0dh,0ah,0 _zmm9 db 'ZMM9 = %X',0dh,0ah,0 _zmm10 db 'ZMM10 = %X',0dh,0ah,0 _zmm11 db 'ZMM11 = %X',0dh,0ah,0 _zmm12 db 'ZMM12 = %X',0dh,0ah,0 _zmm13 db 'ZMM13 = %X',0dh,0ah,0 _zmm14 db 'ZMM14 = %X',0dh,0ah,0 _zmm15 db 'ZMM15 = %X',0dh,0ah,0 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> _zmm_hi256 db 'ZMM_Hi256 = %X',0dh,0ah,0 _zmm0_h db 'ZMM0_H = %X',0dh,0ah,0 _zmm1_h db 'ZMM1_H = %X',0dh,0ah,0 _zmm2_h db 'ZMM2_H = %X',0dh,0ah,0 _zmm3_h db 'ZMM3_H = %X',0dh,0ah,0 _zmm4_h db 'ZMM4_H = %X',0dh,0ah,0 _zmm5_h db 'ZMM5_H = %X',0dh,0ah,0 _zmm6_h db 'ZMM6_H = %X',0dh,0ah,0 _zmm7_h db 'ZMM7_H = %X',0dh,0ah,0 ; _zmm8_h db 'ZMM8_H = %X',0dh,0ah,0 _zmm9_h db 'ZMM9_H = %X',0dh,0ah,0 _zmm10_h db 'ZMM10_H = %X',0dh,0ah,0 _zmm11_h db 'ZMM11_H = %X',0dh,0ah,0 _zmm12_h db 'ZMM12_H = %X',0dh,0ah,0 _zmm13_h db 'ZMM13_H = %X',0dh,0ah,0 _zmm14_h db 'ZMM14_H = %X',0dh,0ah,0 _zmm15_h db 'ZMM15_H = %X',0dh,0ah,0 ; 64位模式 _hi16_zmm db 'Hi16_ZMM = %X',0dh,0ah,0 _zmm16 db 'ZMM16 = %X',0dh,0ah,0 _zmm17 db 'ZMM17 = %X',0dh,0ah,0 _zmm18 db 'ZMM18 = %X',0dh,0ah,0 _zmm19 db 'ZMM19 = %X',0dh,0ah,0 _zmm20 db 'ZMM20 = %X',0dh,0ah,0 _zmm21 db 'ZMM21 = %X',0dh,0ah,0 _zmm22 db 'ZMM22 = %X',0dh,0ah,0 _zmm23 db 'ZMM23 = %X',0dh,0ah,0 _zmm24 db 'ZMM24 = %X',0dh,0ah,0 _zmm25 db 'ZMM25 = %X',0dh,0ah,0 _zmm26 db 'ZMM26 = %X',0dh,0ah,0 _zmm27 db 'ZMM27 = %X',0dh,0ah,0 _zmm28 db 'ZMM28 = %X',0dh,0ah,0 _zmm29 db 'ZMM29 = %X',0dh,0ah,0 _zmm30 db 'ZMM30 = %X',0dh,0ah,0 _zmm31 db 'ZMM31 = %X',0dh,0ah,0 ; Intel MPX 支持 _bnd0 db 'BND0 = %X',0dh,0ah,0 _bnd1 db 'BND1 = %X',0dh,0ah,0 _bnd2 db 'BND2 = %X',0dh,0ah,0 _bnd3 db 'BND3 = %X',0dh,0ah,0 _pt db 'PT = %X',0dh,0ah,0 _pkru db 'PKRU = %X',0dh,0ah,0 _cet_u db 'CET_U = %X',0dh,0ah,0 _cet_s db 'CET_S = %X',0dh,0ah,0 _hdc db 'HDC = %X',0dh,0ah,0 _hwp db 'HWP = %X',0dh,0ah,0 [section .text] start: xor rax,rax xor al,al al_1: push rax lea rax,_al push rax call printf pop rax pop rax inc al test al,0ffh jnz al_1 xor rax,rax, xor ah,ah ah_1: push rax lea rax,_ah push rax call printf pop rax pop rax inc ah test ah,0ffh jnz ah_1 xor rbx,rbx xor bl,bl bl_1: push rbx lea rax,_bl push rax call printf pop rax pop rbx inc bl test bl,0ffh jnz bl_1 xor rbx,rbx xor bh,bh bh_1: push rbx lea rax,_bh push rax call printf pop rax pop rbx inc bh test bh,0ffh jnz bh_1 xor rcx,rcx xor cl,cl cl_1: push rcx lea rax,_cl push rax call printf pop rax pop rcx inc cl test cl,0ffh jnz cl_1 xor rcx,rcx xor ch,ch ch_1: push rcx lea rax,_ch push rax call printf pop rax pop rcx inc ch test ch,0ffh jnz ch_1 xor rdx,rdx xor dl,dl dl_1: push rdx lea rax,_dl push rax call printf pop rax pop rdx inc dl test dl,0ffh jnz dl_1 xor rdx,rdx xor dh,dh dh_1: push rdx lea rax,_dh push rax call printf pop rax pop rdx inc dh test dh,0ffh jnz dh_1 xor rax,rax xor ax,ax ax_1: push rax lea rax,_ax push rax call printf pop rax pop rax inc ax test ax,0ffffh jnz bx_1 xor rbx,rbx xor bx,bx bx_1: push rbx lea rax,_bx push rax call printf pop rax pop rbx inc bx test bx,0ffffh jnz bx_1 xor rcx,rcx xor bh,bh cx_1: push rcx lea rax,_cx push rax call printf pop rax pop rcx inc cx test cx,0ffffh jnz cx_1 xor rdx,rdx xor dx,dx dx_1: push rdx lea rax,_dx push rax call printf pop rax pop rdx inc dx test dx,0ffffh jnz dx_1 ; 汇编语言不能编译和识别的寄存器 ;======================================== ; REX.B REG段 ;---------------------------------------- ; SPL 是 4 ; BPL 是 5 ; SIL 是 6 ; DIL 是 7 ; 可以通过机器编码指令表计算出指令值 ; ***** 具体计算公式看前面指令概要! ***** ;======================================== ; xor rbp,rbp ; xor bpl,bpl ; 汇编语言没有这个指令啊!!! CPU 有。 ;bpl_1: ; push rbp ; call printf ; inc bpl ; jnc bpl_1 ; xor rsp,rsp ; xor spl,spl ;spl_1: ; push rsp ; call printf ; inc spl ; jnc spl_1 ; xor rsi,rsi ; xor sil,sil ;sil_1: ; push rsi ; call printf ; inc sil ; jnc sil_1 ; xor rdi,rdi ; xor dil,dil ;dil_1: ; push rdi ; call printf ; inc dil ; jnc dil_1 xor rax,rax xor eax,eax eax_1: push rax lea rax,_eax push rax call printf pop rax pop rax mov eax,0ffffffffh test eax,0ffffffffh push rax lea rax,_eax push rax call printf pop rax pop rax xor rbx,rbx xor ebx,ebx ebx_1: push rbx lea rax,_ebx push rax call printf pop rax pop rbx mov ebx,0ffffffffh test ebx,0ffffffffh push rbx lea rax,_ebx push rax call printf pop rax pop rbx xor rcx,rcx xor ecx,ecx ecx_1: push rcx lea rax,_ecx push rax call printf pop rax pop rcx mov ecx,0ffffffffh test ecx,0ffffffffh push rcx lea rax,_ecx push rax call printf pop rax pop rcx xor rdx,rdx xor edx,edx edx_1: push rdx lea rax,_edx push rax call printf pop rax pop rdx mov edx,0ffffffffh test edx,0ffffffffh push rdx lea rax,_edx push rax call printf pop rax pop rdx edx_e: xor rsp,rsp xor esp,esp esp_1: push rsp lea rax,_esp push rax call printf pop rax pop rsp mov esp,0ffffffffh test esp,0ffffffffh push rsp lea rax,_esp push rax call printf pop rax pop rsp xor rbp,rbp xor ebp,ebp ebp_1: push rbp lea rax,_ebp push rax call printf pop rax pop rbp mov ebp,0ffffffffh test ebp,0ffffffffh push rbp lea rax,_ebp push rax call printf pop rax pop rbp xor rsi,rsi xor esi,esi esi_1: push rsi lea rax,_esi push rax call printf pop rax pop rsi mov esi,0ffffffffh test ebp,0ffffffffh xor rdi,rdi xor edi,edi edi_1: push rdi lea rax,_edi push rax call printf pop rax pop rdi mov edi,0ffffffffh test edi,0ffffffffh push rdi lea rax,_edi push rax call printf pop rax pop rdi xor rax,rax rax_1: push rax lea rax,_rax push rax call printf pop rax pop rax mov rax,0ffffffffffffffffh test rax,0ffffffffffffffffh push rax lea rax,_rax push rax call printf pop rax pop rax xor rcx,rcx rcx_1: push rcx lea rax,_rcx push rax call printf pop rax pop rcx mov rcx,0ffffffffffffffffh test rcx,0ffffffffffffffffh push rcx lea rax,_rcx push rax call printf pop rax pop rcx xor rbx,rbx rbx_1: push rbx lea rax,_rbx push rax call printf pop rax pop rbx mov rbx,0ffffffffffffffffh test rbx,0ffffffffffffffffh mov rbx,0ffffffffffffffffh push rbx lea rax,_rbx push rax call printf pop rax pop rbx xor rdx,rdx rdx_1: push rdx lea rax,_rdx push rax call printf pop rax pop rdx mov rdx,0ffffffffffffffffh test rdx,0ffffffffffffffffh push rdx lea rax,_rdx push rax call printf pop rax pop rdx xor rbp,rbp rbp_1: push rbp lea rax,_rbp push rax call printf pop rax pop rbp mov rbp,0ffffffffffffffffh test rbp,0ffffffffffffffffh push rbp lea rax,_rbp push rax call printf pop rax pop rbp xor rsp,rsp rsp_1: push rsp lea rax,_rsp push rax call printf pop rax pop rsp mov rsp,0ffffffffffffffffh test rsp,0ffffffffffffffffh push rsp lea rax,_rsp push rax call printf pop rax pop rsp xor rdi,rdi rdi_1: push rdi lea rax,_rdi push rax call printf pop rax pop rdi mov rdi,0ffffffffffffffffh test rdi,0ffffffffffffffffh push rdi lea rax,_rdi push rax call printf pop rax pop rdi xor rsi,rsi rsi_1: push rsi lea rax,_rsi push rax call printf pop rax pop rsi mov rsi,0ffffffffffffffffh test rsi,0ffffffffffffffffh push rsi lea rax,_rsi push rax call printf pop rax pop rsi ; 新版本测试IP寄存器 ;ip_1: ; push ip ; lea eax,_ip ; push eax ; call printf ; pop eax ; pop ip ; 新版本测试 ;eip_1: ; push eip ; call printf ; 新版本测试 ;rip_1: ; push rip ; call printf ; 新版本测试 ;cs_1: ; push cs ; call printf ; 新版本测试 ;ds_1: ; push ds ; call printf ; 新版本测试 ;es_1: ; push es ; call printf ; 新版本测试 ;fs_1: ; push fs ; call printf ; 新版本测试 ;falg_1: ; pushf ; call printf ; 新版本测试 ;eflag_1: ; pushf ; call printf ; 新版本测试 ;rflag_1: ; pushf ; call printf ; 新版本测试 r0l-r7l ;r0l_1: ; push r0l ; lea rax,_r0l ; push rax ; call printf ; pop rax ; pop r0l ; mov r0l,0ffffffffh ; jnc r0l_1 ;r1l_1: ; push r1l ; lea rax,_r1l ; push rax ; call printf ; pop rax ; pop r1l ; mov r1l,0ffffffffh ; jnc r1l_1 ;r2l_1: ; push r2l ; lea rax,_r2l ; push rax ; call printf ; pop rax ; pop r2l ; mov r2l,0ffffffffh ; jnc r2l_1 ;r3l_1: ; push r3l ; lea rax,_r3l ; push rax ; call printf ; pop rax ; pop r3l ; mov r3l,0ffffffffh ; jnc r3l_1 ;r4l_1: ; push r4l ; lea rax,_r4l ; push rax ; call printf ; pop rax ; pop r4l ; mov r4l,0ffffffffh ; jnc r4l_1 ;r5l_1: ; push r5l ; lea rax,_r5l ; push rax ; call printf ; pop rax ; pop r5l ; mov r5l,0ffffffffh ; jnc r5l_1 ;r6l_1: ; push r6l ; lea rax,_r6l ; push rax ; call printf ; pop rax ; pop r6l ; mov r6l,0ffffffffh ; jnc r6l_1 ;r7l_1: ; push r7l ; lea rax,_r7l ; push rax ; call printf ; pop rax ; pop r7l ; mov r7l,0ffffffffh ; jnc r7l_1 ; 新版本nasm汇编再用 r0w-r7w ;r0w_1: ; push r0w ; call printf ;r1w_1: ; push r1w ; call printf ;r2w_1: ; push r2w ; call printf ;r3w_1: ; push r3w ; call printf ;r4w_1: ; push r4l ; call printf ;r5w_1: ; push r5l ; call printf ;r6w_1: ; push r6w ; call printf ;r7w_1: ; push r7w ; call printf ; push r7l ; lea rax,_r7l ; push rax ; call printf ; pop rax ; pop r7l ; mov r7l,0ffffffffh ; jnc r7l_1 r8w_1: push r8w lea rax,_r8w push rax call printf pop rax pop r8w jnc r8w_1 r9w_1: push r9w lea rax,_r9w push rax call printf pop rax pop r9w jnc r9w_1 r10w_1: push r10w lea rax,_r10w push rax call printf pop rax pop r10w jnc r10w_1 r11w_1: push r11w lea rax,_r11w push rax call printf pop rax pop r11w jnc r11w_1 r12w_1: push r12w lea rax,_r12w push rax call printf pop rax pop r12w jnc r12w_1 r13w_1: push r13w lea rax,_r13w push rax call printf pop rax pop r13w jnc r13w_1 r14w_1: push r14w lea rax,_r14w push rax call printf pop rax pop r14w jnc r14w_1 r15w_1: push r15w lea rax,_r15w push rax call printf pop rax pop r15w jnc r15w_1 ; 新版本支持 r0d-r7d nasm汇编语言支持 ;r0d_1: ; push r0d ; call printf ;r1d_1: ; push r1d ; call printf ;r2d_1: ; push r2d ; call printf ;r3d_1: ; push r3d ; call printf ;r4d_1: ; push r4d ; call printf ;r5d_1: ; push r5d ; call printf ;r6d_1: ; push r6d ; call printf ;r7d_1: ; push r7d ; call printf ; 新版本支持 r0-r7 nasm汇编语言支持 ;r0_1: ; push r0 ; call printf ;r1_1: ; push r1 ; call printf ;r2_1: ; push r2 ; call printf ;r3_1: ; push r3 ; call printf ;r4_1: ; push r4 ; call printf ;r5_1: ; push r5 ; call printf ;r6_1: ; push r6 ; call printf ;r7_1: ; push r7 ; call printf ; 需要改进的测试方法 ;st0_1: ; push st0 ; call printf ;st1_1: ; push st1 ; call printf ;st2_1: ; push st2 ; call printf ;st3_1: ; push st3 ; call printf ;st4_1: ; push st4 ; call printf ;st5_1: ; push st5 ; call printf ;st6_1: ; push st6 ; call printf ;st7_1: ; push st7 ; call printf ; 新版本支持,略过... mmx0-mmx31 nasm 汇编语言要支持 ; 测试方法 ;mmx0_1: ; push mmx0 ; call printf ;mmx1_1: ; push mmx1 ; call printf ;mmx2_1: ; push mmx2 ; call printf ;mmx3_1: ; push mmx3 ; call printf ;mmx4_1: ; push mmx4 ; call printf ;mmx5_1: ; push mmx5 ; call printf ;mmx6_1: ; push mmx6 ; call printf ;mmx7_1: ; push mmx7 ; call printf ;mmx8_1: ; push mmx8 ; call printf ;mmx9_1: ; push mmx9 ; call printf ;mmx10_1: ; push mmx10 ; call printf ;mmx11_1: ; push mmx11 ; call printf ;mmx12_1: ; push mmx12 ; call printf ;mmx13_1: ; push mmx13 ; call printf ;mmx14_1: ; push mmx14 ; call printf ;mmx15_1: ; push mmx15 ; call printf xmm0_1: movups xmm0,[n_128] push rax lea rax,_xmm0 push rax call printf pop rax pop rax xmm1_1: movups xmm1,[n_128] push rax lea rax,_xmm1 push rax call printf pop rax pop rax xmm2_1: movups xmm2,[n_128] push rax lea rax,_xmm2 push rax call printf pop rax pop rax xmm3_1: movups xmm3,[n_128] push rax lea rax,_xmm3 push rax call printf pop rax pop rax xmm4_1: movups xmm4,[n_128] push rax lea rax,_xmm4 push rax call printf pop rax pop rax xmm5_1: movups xmm5,[n_128] push rax lea rax,_xmm5 push rax call printf pop rax pop rax xmm6_1: movups xmm6,[n_128] push rax lea rax,_xmm6 push rax call printf pop rax pop rax xmm7_1: movups xmm7,[n_128] push rax lea rax,_xmm7 push rax call printf pop rax pop rax xmm8_1: movups xmm8,[n_128] push rax lea rax,_xmm8 push rax call printf pop rax pop rax xmm9_1: movups xmm9,[n_128] push rax lea rax,_xmm9 push rax call printf pop rax pop rax xmm10_1: movups xmm10,[n_128] push rax lea rax,_xmm10 push rax call printf pop rax pop rax xmm11_1: movups xmm11,[n_128] push rax lea rax,_xmm11 push rax call printf pop rax pop rax xmm12_1: movups xmm12,[n_128] push rax lea rax,_xmm12 push rax call printf pop rax pop rax xmm13_1: movups xmm13,[n_128] push rax lea rax,_xmm13 push rax call printf pop rax pop rax xmm14_1: movups xmm14,[n_128] push rax lea rax,_xmm14 push rax call printf pop rax pop rax xmm15_1: movups xmm15,[n_128] push rax lea rax,_xmm15 push rax call printf pop rax pop rax ymm0_1: vmovups ymm0,[n_256] lea rax,_ymm0 push rax call printf pop rax pop rax ymm1_1: vmovups ymm1,[n_256] lea rax,_ymm1 push rax call printf pop rax pop rax ymm2_1: vmovups ymm2,[n_256] lea rax,_ymm2 push rax call printf pop rax pop rax ymm3_1: vmovups ymm3,[n_256] lea rax,_ymm3 push rax call printf pop rax pop rax ymm4_1: vmovups ymm4,[n_256] lea rax,_ymm4 push rax call printf pop rax pop rax ymm5_1: vmovups ymm5,[n_256] lea rax,_ymm5 push rax call printf pop rax pop rax ymm6_1: vmovups ymm6,[n_256] lea rax,_ymm6 push rax call printf pop rax pop rax ymm7_1: vmovups ymm7,[n_256] lea rax,_ymm7 push rax call printf pop rax pop rax ymm8_1: vmovups ymm8,[n_256] lea rax,_ymm8 push rax call printf pop rax pop rax ymm9_1: vmovups ymm9,[n_256] lea rax,_ymm9 push rax call printf pop rax pop rax ymm10_1: vmovups ymm10,[n_256] lea rax,_ymm10 push rax call printf pop rax pop rax ymm11_1: vmovups ymm11,[n_256] lea rax,_ymm11 push rax call printf pop rax pop rax ymm12_1: vmovups ymm12,[n_256] lea rax,_ymm12 push rax call printf pop rax pop rax ymm13_1: vmovups ymm13,[n_256] lea rax,_ymm13 push rax call printf pop rax pop rax ymm14_1: vmovups ymm14,[n_256] lea rax,_ymm14 push rax call printf pop rax pop rax ymm15_1: vmovups ymm15,[n_256] lea rax,_ymm15 push rax call printf pop rax pop rax ; ++++++++++ 新增 ++++++++++ ; 只有 AVX512 才有 改变高速缓存 ; 参于操作的有xmm,ymm寄存器 ;zmm0_1: ; vgatherdps zmm0{k3},[ymm15*8] ; lea rax,_zmm0 ; push rax ; call printf ; pop rax ;zmm1_1: ; vgatherdps zmm1{k3},[ymm15*8] ; lea rax,_zmm1 ; push rax ; call printf ; pop rax ;zmm2_1: ; vgatherdps zmm2{k3},[ymm15*8] ; lea rax,_zmm2 ; push rax ; call printf ; pop rax ;zmm3_1: ; vgatherdps zmm3{k3},[ymm15*8] ; lea rax,_zmm3 ; push rax ; call printf ; pop rax ;zmm4_1: ; vgatherdps zmm4{k3},[ymm15*8] ; lea rax,_zmm4 ; push rax ; call printf ; pop rax ;zmm5_1: ; vgatherdps zmm5{k3},[ymm15*8] ; lea rax,_zmm5 ; push rax ; call printf ; pop rax ;zmm6_1: ; vgatherdps zmm6{k3},[ymm15*8] ; lea rax,_zmm6 ; push rax ; call printf ; pop rax ;zmm7_1: ; vgatherdps zmm7{k3},[ymm15*8] ; lea rax,_zmm7 ; push rax ; call printf ; pop rax ;zmm8_1: ; vgatherdps zmm8{k3},[ymm15*8] ; lea rax,_zmm8 ; push rax ; call printf ; pop rax ;zmm9_1: ; vgatherdps zmm9{k3},[ymm15*8] ; lea rax,_zmm9 ; push rax ; call printf ; pop rax ;zmm10_1: ; vgatherdps zmm10{k3},[ymm15*8] ; lea rax,_zmm10 ; push rax ; call printf ; pop rax ;zmm11_1: ; vgatherdps zmm11{k3},[ymm15*8] ; lea rax,_zmm11 ; push rax ; call printf ; pop rax ;zmm12_1: ; vgatherdps zmm12{k3},[ymm15*8] ; lea rax,_zmm12 ; push rax ; call printf ; pop rax ;zmm13_1: ; vgatherdps zmm13{k3},[ymm15*8] ; lea rax,_zmm13 ; push rax ; call printf ; pop rax ;zmm14_1: ; vgatherdps zmm0{k3},[ymm15*8] ; lea rax,_zmm14 ; push rax ; call printf ; pop rax ;zmm15_1: ; vgatherdps zmm15{k3},[ymm15*8] ; lea rax,_zmm15 ; push rax ; call printf ; pop rax ;hi16_zmm1: ; vgatherdps hi16_zmm{k3},[ymm15*8] ; lea rax,hi16_zmm ; push rax ; call printf ; pop rax ;zmm16_1: ; vgatherdps zmm16{k3},[ymm15*8] ; lea rax,_zmm16 ; push rax ; call printf ; pop rax ;zmm17_1: ; vgatherdps zmm17{k3},[ymm15*8] ; lea rax,_zmm17 ; push rax ; call printf ; pop rax ;zmm18_1: ; vgatherdps zmm18{k3},[ymm15*8] ; lea rax,_zmm18 ; push rax ; call printf ; pop rax ;zmm19_1: ; vgatherdps zmm19{k3},[ymm15*8] ; lea rax,_zmm19 ; push rax ; call printf ; pop rax ;zmm20_1: ; vgatherdps zmm20{k3},[ymm15*8] ; lea rax,_zmm20 ; push rax ; call printf ; pop rax ;zmm21_1: ; vgatherdps zmm21{k3},[ymm15*8] ; lea rax,_zmm21 ; push rax ; call printf ; pop rax ;zmm22_1: ; vgatherdps zmm22{k3},[ymm15*8] ; lea rax,_zmm22 ; push rax ; call printf ; pop rax ;zmm23_1: ; vgatherdps zmm23{k3},[ymm15*8] ; lea rax,_zmm23 ; push rax ; call printf ; pop rax ;zmm24_1: ; vgatherdps zmm24{k3},[ymm15*8] ; lea rax,_zmm24 ; push rax ; call printf ; pop rax ;zmm25_1: ; vgatherdps zmm25{k3},[ymm15*8] ; lea rax,_zmm25 ; push rax ; call printf ; pop rax ;zmm26_1: ; vgatherdps zmm26{k3},[ymm15*8] ; lea rax,_zmm26 ; push rax ; call printf ; pop rax ;zmm27_1: ; vgatherdps zmm27{k3},[ymm15*8] ; lea rax,_zmm27 ; push rax ; call printf ; pop rax ;zmm28_1: ; vgatherdps zmm28{k3},[ymm15*8] ; lea rax,_zmm28 ; push rax ; call printf ; pop rax ;zmm29_1: ; vgatherdps zmm29{k3},[ymm15*8] ; lea rax,_zmm29 ; push rax ; call printf ; pop rax ;zmm30_1: ; vgatherdps zmm30{k3},[ymm15*8] ; lea rax,_zmm30 ; push rax ; call printf ; pop rax ;zmm31_1: ; vgatherdps zmm31{k3},[ymm15*8] ; lea rax,_zmm31 ; push rax ; call printf ; pop rax ; ymm0_h-ymm15_h 用于avx 技术系列 ; 新版本支持 nasm汇编语言未识别 cpu类别不同 ymm0_h1: ; push ymm0_h ; call printf ymm1_h1: ymm2_h1: ymm3_h1: ymm4_h1: ymm5_h1: ymm6_h1: ymm7_h1: ymm8_h1: ymm9_h1: ymm10_h1: ymm11_h1: ymm12_h1: ymm13_h1: ymm14_h1: ymm15_h1: ; zmm0_h-zmm15_h 用于avx 技术系列 ; 新版本支持 nasm汇编语言未识别 cpu类别不同 zmm_hi256: zmm0_h1: zmm1_h1: zmm2_h1: zmm3_h1: zmm4_h1: zmm5_h1: zmm6_h1: zmm7_h1: zmm8_h1: zmm9_h1: zmm10_h1: zmm11_h1: zmm12_h1: zmm13_h1: zmm14_h1: zmm15_h1: