github.com/chenzhuoyu/iasm@v0.9.1/x86_64/registers.go (about) 1 package x86_64 2 3 import ( 4 `fmt` 5 ) 6 7 // Register represents a hardware register. 8 type Register interface { 9 fmt.Stringer 10 implRegister() 11 } 12 13 type ( 14 Register8 byte 15 Register16 byte 16 Register32 byte 17 Register64 byte 18 ) 19 20 type ( 21 KRegister byte 22 MMRegister byte 23 XMMRegister byte 24 YMMRegister byte 25 ZMMRegister byte 26 ) 27 28 // RegisterMask is a KRegister used to mask another register. 29 type RegisterMask struct { 30 Z bool 31 K KRegister 32 } 33 34 // String implements the fmt.Stringer interface. 35 func (self RegisterMask) String() string { 36 if !self.Z { 37 return fmt.Sprintf("{%%%s}", self.K) 38 } else { 39 return fmt.Sprintf("{%%%s}{z}", self.K) 40 } 41 } 42 43 // MaskedRegister is a Register masked by a RegisterMask. 44 type MaskedRegister struct { 45 Reg Register 46 Mask RegisterMask 47 } 48 49 // String implements the fmt.Stringer interface. 50 func (self MaskedRegister) String() string { 51 return self.Reg.String() + self.Mask.String() 52 } 53 54 const ( 55 AL Register8 = iota 56 CL 57 DL 58 BL 59 SPL 60 BPL 61 SIL 62 DIL 63 R8b 64 R9b 65 R10b 66 R11b 67 R12b 68 R13b 69 R14b 70 R15b 71 ) 72 73 const ( 74 AH = SPL | 0x80 75 CH = BPL | 0x80 76 DH = SIL | 0x80 77 BH = DIL | 0x80 78 ) 79 80 const ( 81 AX Register16 = iota 82 CX 83 DX 84 BX 85 SP 86 BP 87 SI 88 DI 89 R8w 90 R9w 91 R10w 92 R11w 93 R12w 94 R13w 95 R14w 96 R15w 97 ) 98 99 const ( 100 EAX Register32 = iota 101 ECX 102 EDX 103 EBX 104 ESP 105 EBP 106 ESI 107 EDI 108 R8d 109 R9d 110 R10d 111 R11d 112 R12d 113 R13d 114 R14d 115 R15d 116 ) 117 118 const ( 119 RAX Register64 = iota 120 RCX 121 RDX 122 RBX 123 RSP 124 RBP 125 RSI 126 RDI 127 R8 128 R9 129 R10 130 R11 131 R12 132 R13 133 R14 134 R15 135 ) 136 137 const ( 138 K0 KRegister = iota 139 K1 140 K2 141 K3 142 K4 143 K5 144 K6 145 K7 146 ) 147 148 const ( 149 MM0 MMRegister = iota 150 MM1 151 MM2 152 MM3 153 MM4 154 MM5 155 MM6 156 MM7 157 ) 158 159 const ( 160 XMM0 XMMRegister = iota 161 XMM1 162 XMM2 163 XMM3 164 XMM4 165 XMM5 166 XMM6 167 XMM7 168 XMM8 169 XMM9 170 XMM10 171 XMM11 172 XMM12 173 XMM13 174 XMM14 175 XMM15 176 XMM16 177 XMM17 178 XMM18 179 XMM19 180 XMM20 181 XMM21 182 XMM22 183 XMM23 184 XMM24 185 XMM25 186 XMM26 187 XMM27 188 XMM28 189 XMM29 190 XMM30 191 XMM31 192 ) 193 194 const ( 195 YMM0 YMMRegister = iota 196 YMM1 197 YMM2 198 YMM3 199 YMM4 200 YMM5 201 YMM6 202 YMM7 203 YMM8 204 YMM9 205 YMM10 206 YMM11 207 YMM12 208 YMM13 209 YMM14 210 YMM15 211 YMM16 212 YMM17 213 YMM18 214 YMM19 215 YMM20 216 YMM21 217 YMM22 218 YMM23 219 YMM24 220 YMM25 221 YMM26 222 YMM27 223 YMM28 224 YMM29 225 YMM30 226 YMM31 227 ) 228 229 const ( 230 ZMM0 ZMMRegister = iota 231 ZMM1 232 ZMM2 233 ZMM3 234 ZMM4 235 ZMM5 236 ZMM6 237 ZMM7 238 ZMM8 239 ZMM9 240 ZMM10 241 ZMM11 242 ZMM12 243 ZMM13 244 ZMM14 245 ZMM15 246 ZMM16 247 ZMM17 248 ZMM18 249 ZMM19 250 ZMM20 251 ZMM21 252 ZMM22 253 ZMM23 254 ZMM24 255 ZMM25 256 ZMM26 257 ZMM27 258 ZMM28 259 ZMM29 260 ZMM30 261 ZMM31 262 ) 263 264 func (self Register8) implRegister() {} 265 func (self Register16) implRegister() {} 266 func (self Register32) implRegister() {} 267 func (self Register64) implRegister() {} 268 269 func (self KRegister) implRegister() {} 270 func (self MMRegister) implRegister() {} 271 func (self XMMRegister) implRegister() {} 272 func (self YMMRegister) implRegister() {} 273 func (self ZMMRegister) implRegister() {} 274 275 func (self Register8) String() string { if int(self) >= len(r8names) { return "???" } else { return r8names[self] } } 276 func (self Register16) String() string { if int(self) >= len(r16names) { return "???" } else { return r16names[self] } } 277 func (self Register32) String() string { if int(self) >= len(r32names) { return "???" } else { return r32names[self] } } 278 func (self Register64) String() string { if int(self) >= len(r64names) { return "???" } else { return r64names[self] } } 279 280 func (self KRegister) String() string { if int(self) >= len(knames) { return "???" } else { return knames[self] } } 281 func (self MMRegister) String() string { if int(self) >= len(mmnames) { return "???" } else { return mmnames[self] } } 282 func (self XMMRegister) String() string { if int(self) >= len(xmmnames) { return "???" } else { return xmmnames[self] } } 283 func (self YMMRegister) String() string { if int(self) >= len(ymmnames) { return "???" } else { return ymmnames[self] } } 284 func (self ZMMRegister) String() string { if int(self) >= len(zmmnames) { return "???" } else { return zmmnames[self] } } 285 286 // Registers maps register name into Register instances. 287 var Registers = map[string]Register { 288 "al" : AL, 289 "cl" : CL, 290 "dl" : DL, 291 "bl" : BL, 292 "spl" : SPL, 293 "bpl" : BPL, 294 "sil" : SIL, 295 "dil" : DIL, 296 "r8b" : R8b, 297 "r9b" : R9b, 298 "r10b" : R10b, 299 "r11b" : R11b, 300 "r12b" : R12b, 301 "r13b" : R13b, 302 "r14b" : R14b, 303 "r15b" : R15b, 304 "ah" : AH, 305 "ch" : CH, 306 "dh" : DH, 307 "bh" : BH, 308 "ax" : AX, 309 "cx" : CX, 310 "dx" : DX, 311 "bx" : BX, 312 "sp" : SP, 313 "bp" : BP, 314 "si" : SI, 315 "di" : DI, 316 "r8w" : R8w, 317 "r9w" : R9w, 318 "r10w" : R10w, 319 "r11w" : R11w, 320 "r12w" : R12w, 321 "r13w" : R13w, 322 "r14w" : R14w, 323 "r15w" : R15w, 324 "eax" : EAX, 325 "ecx" : ECX, 326 "edx" : EDX, 327 "ebx" : EBX, 328 "esp" : ESP, 329 "ebp" : EBP, 330 "esi" : ESI, 331 "edi" : EDI, 332 "r8d" : R8d, 333 "r9d" : R9d, 334 "r10d" : R10d, 335 "r11d" : R11d, 336 "r12d" : R12d, 337 "r13d" : R13d, 338 "r14d" : R14d, 339 "r15d" : R15d, 340 "rax" : RAX, 341 "rcx" : RCX, 342 "rdx" : RDX, 343 "rbx" : RBX, 344 "rsp" : RSP, 345 "rbp" : RBP, 346 "rsi" : RSI, 347 "rdi" : RDI, 348 "r8" : R8, 349 "r9" : R9, 350 "r10" : R10, 351 "r11" : R11, 352 "r12" : R12, 353 "r13" : R13, 354 "r14" : R14, 355 "r15" : R15, 356 "k0" : K0, 357 "k1" : K1, 358 "k2" : K2, 359 "k3" : K3, 360 "k4" : K4, 361 "k5" : K5, 362 "k6" : K6, 363 "k7" : K7, 364 "mm0" : MM0, 365 "mm1" : MM1, 366 "mm2" : MM2, 367 "mm3" : MM3, 368 "mm4" : MM4, 369 "mm5" : MM5, 370 "mm6" : MM6, 371 "mm7" : MM7, 372 "xmm0" : XMM0, 373 "xmm1" : XMM1, 374 "xmm2" : XMM2, 375 "xmm3" : XMM3, 376 "xmm4" : XMM4, 377 "xmm5" : XMM5, 378 "xmm6" : XMM6, 379 "xmm7" : XMM7, 380 "xmm8" : XMM8, 381 "xmm9" : XMM9, 382 "xmm10" : XMM10, 383 "xmm11" : XMM11, 384 "xmm12" : XMM12, 385 "xmm13" : XMM13, 386 "xmm14" : XMM14, 387 "xmm15" : XMM15, 388 "xmm16" : XMM16, 389 "xmm17" : XMM17, 390 "xmm18" : XMM18, 391 "xmm19" : XMM19, 392 "xmm20" : XMM20, 393 "xmm21" : XMM21, 394 "xmm22" : XMM22, 395 "xmm23" : XMM23, 396 "xmm24" : XMM24, 397 "xmm25" : XMM25, 398 "xmm26" : XMM26, 399 "xmm27" : XMM27, 400 "xmm28" : XMM28, 401 "xmm29" : XMM29, 402 "xmm30" : XMM30, 403 "xmm31" : XMM31, 404 "ymm0" : YMM0, 405 "ymm1" : YMM1, 406 "ymm2" : YMM2, 407 "ymm3" : YMM3, 408 "ymm4" : YMM4, 409 "ymm5" : YMM5, 410 "ymm6" : YMM6, 411 "ymm7" : YMM7, 412 "ymm8" : YMM8, 413 "ymm9" : YMM9, 414 "ymm10" : YMM10, 415 "ymm11" : YMM11, 416 "ymm12" : YMM12, 417 "ymm13" : YMM13, 418 "ymm14" : YMM14, 419 "ymm15" : YMM15, 420 "ymm16" : YMM16, 421 "ymm17" : YMM17, 422 "ymm18" : YMM18, 423 "ymm19" : YMM19, 424 "ymm20" : YMM20, 425 "ymm21" : YMM21, 426 "ymm22" : YMM22, 427 "ymm23" : YMM23, 428 "ymm24" : YMM24, 429 "ymm25" : YMM25, 430 "ymm26" : YMM26, 431 "ymm27" : YMM27, 432 "ymm28" : YMM28, 433 "ymm29" : YMM29, 434 "ymm30" : YMM30, 435 "ymm31" : YMM31, 436 "zmm0" : ZMM0, 437 "zmm1" : ZMM1, 438 "zmm2" : ZMM2, 439 "zmm3" : ZMM3, 440 "zmm4" : ZMM4, 441 "zmm5" : ZMM5, 442 "zmm6" : ZMM6, 443 "zmm7" : ZMM7, 444 "zmm8" : ZMM8, 445 "zmm9" : ZMM9, 446 "zmm10" : ZMM10, 447 "zmm11" : ZMM11, 448 "zmm12" : ZMM12, 449 "zmm13" : ZMM13, 450 "zmm14" : ZMM14, 451 "zmm15" : ZMM15, 452 "zmm16" : ZMM16, 453 "zmm17" : ZMM17, 454 "zmm18" : ZMM18, 455 "zmm19" : ZMM19, 456 "zmm20" : ZMM20, 457 "zmm21" : ZMM21, 458 "zmm22" : ZMM22, 459 "zmm23" : ZMM23, 460 "zmm24" : ZMM24, 461 "zmm25" : ZMM25, 462 "zmm26" : ZMM26, 463 "zmm27" : ZMM27, 464 "zmm28" : ZMM28, 465 "zmm29" : ZMM29, 466 "zmm30" : ZMM30, 467 "zmm31" : ZMM31, 468 } 469 470 /** Register Name Tables **/ 471 472 var r8names = [...]string { 473 AL : "al", 474 CL : "cl", 475 DL : "dl", 476 BL : "bl", 477 SPL : "spl", 478 BPL : "bpl", 479 SIL : "sil", 480 DIL : "dil", 481 R8b : "r8b", 482 R9b : "r9b", 483 R10b : "r10b", 484 R11b : "r11b", 485 R12b : "r12b", 486 R13b : "r13b", 487 R14b : "r14b", 488 R15b : "r15b", 489 AH : "ah", 490 CH : "ch", 491 DH : "dh", 492 BH : "bh", 493 } 494 495 var r16names = [...]string { 496 AX : "ax", 497 CX : "cx", 498 DX : "dx", 499 BX : "bx", 500 SP : "sp", 501 BP : "bp", 502 SI : "si", 503 DI : "di", 504 R8w : "r8w", 505 R9w : "r9w", 506 R10w : "r10w", 507 R11w : "r11w", 508 R12w : "r12w", 509 R13w : "r13w", 510 R14w : "r14w", 511 R15w : "r15w", 512 } 513 514 var r32names = [...]string { 515 EAX : "eax", 516 ECX : "ecx", 517 EDX : "edx", 518 EBX : "ebx", 519 ESP : "esp", 520 EBP : "ebp", 521 ESI : "esi", 522 EDI : "edi", 523 R8d : "r8d", 524 R9d : "r9d", 525 R10d : "r10d", 526 R11d : "r11d", 527 R12d : "r12d", 528 R13d : "r13d", 529 R14d : "r14d", 530 R15d : "r15d", 531 } 532 533 var r64names = [...]string { 534 RAX : "rax", 535 RCX : "rcx", 536 RDX : "rdx", 537 RBX : "rbx", 538 RSP : "rsp", 539 RBP : "rbp", 540 RSI : "rsi", 541 RDI : "rdi", 542 R8 : "r8", 543 R9 : "r9", 544 R10 : "r10", 545 R11 : "r11", 546 R12 : "r12", 547 R13 : "r13", 548 R14 : "r14", 549 R15 : "r15", 550 } 551 552 var knames = [...]string { 553 K0: "k0", 554 K1: "k1", 555 K2: "k2", 556 K3: "k3", 557 K4: "k4", 558 K5: "k5", 559 K6: "k6", 560 K7: "k7", 561 } 562 563 var mmnames = [...]string { 564 MM0: "mm0", 565 MM1: "mm1", 566 MM2: "mm2", 567 MM3: "mm3", 568 MM4: "mm4", 569 MM5: "mm5", 570 MM6: "mm6", 571 MM7: "mm7", 572 } 573 574 var xmmnames = [...]string { 575 XMM0 : "xmm0", 576 XMM1 : "xmm1", 577 XMM2 : "xmm2", 578 XMM3 : "xmm3", 579 XMM4 : "xmm4", 580 XMM5 : "xmm5", 581 XMM6 : "xmm6", 582 XMM7 : "xmm7", 583 XMM8 : "xmm8", 584 XMM9 : "xmm9", 585 XMM10 : "xmm10", 586 XMM11 : "xmm11", 587 XMM12 : "xmm12", 588 XMM13 : "xmm13", 589 XMM14 : "xmm14", 590 XMM15 : "xmm15", 591 XMM16 : "xmm16", 592 XMM17 : "xmm17", 593 XMM18 : "xmm18", 594 XMM19 : "xmm19", 595 XMM20 : "xmm20", 596 XMM21 : "xmm21", 597 XMM22 : "xmm22", 598 XMM23 : "xmm23", 599 XMM24 : "xmm24", 600 XMM25 : "xmm25", 601 XMM26 : "xmm26", 602 XMM27 : "xmm27", 603 XMM28 : "xmm28", 604 XMM29 : "xmm29", 605 XMM30 : "xmm30", 606 XMM31 : "xmm31", 607 } 608 609 var ymmnames = [...]string { 610 YMM0 : "ymm0", 611 YMM1 : "ymm1", 612 YMM2 : "ymm2", 613 YMM3 : "ymm3", 614 YMM4 : "ymm4", 615 YMM5 : "ymm5", 616 YMM6 : "ymm6", 617 YMM7 : "ymm7", 618 YMM8 : "ymm8", 619 YMM9 : "ymm9", 620 YMM10 : "ymm10", 621 YMM11 : "ymm11", 622 YMM12 : "ymm12", 623 YMM13 : "ymm13", 624 YMM14 : "ymm14", 625 YMM15 : "ymm15", 626 YMM16 : "ymm16", 627 YMM17 : "ymm17", 628 YMM18 : "ymm18", 629 YMM19 : "ymm19", 630 YMM20 : "ymm20", 631 YMM21 : "ymm21", 632 YMM22 : "ymm22", 633 YMM23 : "ymm23", 634 YMM24 : "ymm24", 635 YMM25 : "ymm25", 636 YMM26 : "ymm26", 637 YMM27 : "ymm27", 638 YMM28 : "ymm28", 639 YMM29 : "ymm29", 640 YMM30 : "ymm30", 641 YMM31 : "ymm31", 642 } 643 644 var zmmnames = [...]string { 645 ZMM0 : "zmm0", 646 ZMM1 : "zmm1", 647 ZMM2 : "zmm2", 648 ZMM3 : "zmm3", 649 ZMM4 : "zmm4", 650 ZMM5 : "zmm5", 651 ZMM6 : "zmm6", 652 ZMM7 : "zmm7", 653 ZMM8 : "zmm8", 654 ZMM9 : "zmm9", 655 ZMM10 : "zmm10", 656 ZMM11 : "zmm11", 657 ZMM12 : "zmm12", 658 ZMM13 : "zmm13", 659 ZMM14 : "zmm14", 660 ZMM15 : "zmm15", 661 ZMM16 : "zmm16", 662 ZMM17 : "zmm17", 663 ZMM18 : "zmm18", 664 ZMM19 : "zmm19", 665 ZMM20 : "zmm20", 666 ZMM21 : "zmm21", 667 ZMM22 : "zmm22", 668 ZMM23 : "zmm23", 669 ZMM24 : "zmm24", 670 ZMM25 : "zmm25", 671 ZMM26 : "zmm26", 672 ZMM27 : "zmm27", 673 ZMM28 : "zmm28", 674 ZMM29 : "zmm29", 675 ZMM30 : "zmm30", 676 ZMM31 : "zmm31", 677 }