diff options
| -rw-r--r-- | quine.asm | 83 |
1 files changed, 45 insertions, 38 deletions
diff --git a/quine.asm b/quine.asm index 13c28a1..9dedc18 100644 --- a/quine.asm +++ b/quine.asm @@ -177,6 +177,8 @@ end macro ; ; "Above" and "below" are for unsigned comparisons. "Greater" and "less" are ; for signed comparisons. +; +; This is documented on the individual opcode pages, and also in B.1.4.7. macro conditioncode cc, condition match =above, condition cc = 0x07 @@ -2917,6 +2919,14 @@ defword opcodereg, 0 defword modrm, 0 dq docol, swap, lit, 8, mul, or, swap, lit, 64, mul, or, pack8, exit +; Stack +; output point +; scale field +; index field +; base field +defword sib, 0 + dq docol, swap, lit, 8, mul, or, swap, lit, 64, mul, or, pack8, exit + ; The simplest of the modrm modes: Direct register addressing. There are no ; special cases to check. ; @@ -2930,7 +2940,7 @@ defword modrm, 0 ; output point ; reg/op field value (raw number) ; reg/mem field register name -defword modrm_reg64, 0 +defword addressing_reg64, 0 dq docol, reg64, lit, 3, unroll3, modrm, exit ; This is a helper for assembly instructions that want to do a form of @@ -2947,7 +2957,7 @@ defword modrm_reg64, 0 ; output point ; reg/op field value (raw number) ; reg/mem field register name -defword modrm_indirect_reg64, 0 +defword addressing_indirect_reg64, 0 dq docol ; Exit with an error if the R/M register is rbp. dq dup, rbp, ne, zbranch, 23*8 @@ -2957,7 +2967,8 @@ defword modrm_indirect_reg64, 0 ; If the R/M register was rsp, we need an SIB byte; otherwise, skip it. dq swap, zbranch, 8*8, lit, 0, lit, 4, rsp, reg64, sib dq exit - dq litstring, "R/M parameter to modrm_indirect_reg64 is rbp.", emitstring + dq litstring, "R/M parameter to addressing_indirect_reg64 is rbp." + dq emitstring dq lit, 1, sys_exit ; This mode can do rbp fine, rsp is the only unusual case. @@ -2967,7 +2978,7 @@ defword modrm_indirect_reg64, 0 ; reg/op field value (raw number) ; reg/mem field register name ; displacement value -defword modrm_disp8_reg64, 0 +defword addressing_disp8_reg64, 0 dq docol ; Check whether the R/M register is rsp; save the test result for later. dq swap, dup, rsp, eq, lit, 5, unroll, swap @@ -2980,14 +2991,6 @@ defword modrm_disp8_reg64, 0 dq swap, pack8 dq exit -; Stack -; output point -; scale field -; index field -; base field -defword sib, 0 - dq docol, swap, lit, 8, mul, or, swap, lit, 64, mul, or, pack8, exit - ; Stack: ; output point defword cld, 0 @@ -3018,7 +3021,7 @@ defword mov_extrareg64_imm64, 0 defword mov_reg64_reg64, 0 dq docol dq roll3, rex_w, lit, 0x89, pack8, unroll3 - dq swap, reg64, swap, modrm_reg64 + dq swap, reg64, swap, addressing_reg64 dq exit ; Stack: @@ -3028,7 +3031,7 @@ defword mov_reg64_reg64, 0 defword mov_indirect_reg64_reg64, 0 dq docol dq roll3, rex_w, lit, 0x89, pack8, unroll3 - dq swap, reg64, swap, modrm_indirect_reg64 + dq swap, reg64, swap, addressing_indirect_reg64 dq exit ; Stack: @@ -3039,7 +3042,7 @@ defword mov_indirect_reg64_reg64, 0 defword mov_disp8_reg64_reg64, 0 dq docol dq lit, 4, roll, rex_w, lit, 0x89, pack8, lit, 4, unroll - dq roll3, reg64, unroll3, modrm_disp8_reg64 + dq roll3, reg64, unroll3, addressing_disp8_reg64 dq exit ; Stack: @@ -3049,7 +3052,7 @@ defword mov_disp8_reg64_reg64, 0 defword mov_reg64_indirect_reg64, 0 dq docol dq roll3, rex_w, lit, 0x8B, pack8, unroll3 - dq reg64, swap, modrm_indirect_reg64 + dq reg64, swap, addressing_indirect_reg64 dq exit ; Stack: @@ -3060,7 +3063,7 @@ defword mov_reg64_indirect_reg64, 0 defword mov_reg64_disp8_reg64, 0 dq docol dq lit, 4, roll, rex_w, lit, 0x8B, pack8, lit, 4, unroll - dq reg64, unroll3, modrm_disp8_reg64 + dq reg64, unroll3, addressing_disp8_reg64 dq exit ; Stack: @@ -3071,7 +3074,7 @@ defword mov_reg64_disp8_reg64, 0 defword lea_reg64_disp8_reg64, 0 dq docol dq lit, 4, roll, rex_w, lit, 0x8D, pack8, lit, 4, unroll - dq reg64, unroll3, modrm_disp8_reg64 + dq reg64, unroll3, addressing_disp8_reg64 dq exit ; Stack: @@ -3098,7 +3101,7 @@ defword lodsq, 0 defword add_reg64_reg64, 0 dq docol dq roll3, rex_w, lit, 0x01, pack8, unroll3 - dq swap, reg64, swap, modrm_reg64 + dq swap, reg64, swap, addressing_reg64 dq exit ; Stack: @@ -3108,7 +3111,7 @@ defword add_reg64_reg64, 0 defword add_indirect_reg64_reg64, 0 dq docol dq roll3, rex_w, lit, 0x01, pack8, unroll3 - dq swap, reg64, swap, modrm_indirect_reg64 + dq swap, reg64, swap, addressing_indirect_reg64 dq exit ; Stack: @@ -3118,7 +3121,7 @@ defword add_indirect_reg64_reg64, 0 defword add_reg64_indirect_reg64, 0 dq docol dq roll3, rex_w, lit, 0x03, pack8, unroll3 - dq reg64, swap, modrm_indirect_reg64 + dq reg64, swap, addressing_indirect_reg64 dq exit ; Stack: @@ -3127,7 +3130,7 @@ defword add_reg64_indirect_reg64, 0 ; target register name defword add_reg64_imm8, 0 dq docol - dq roll3, rex_w, lit, 0x83, pack8, swap, lit, 0, swap, modrm_reg64 + dq roll3, rex_w, lit, 0x83, pack8, swap, lit, 0, swap, addressing_reg64 dq swap, pack8 dq exit @@ -3138,7 +3141,7 @@ defword add_reg64_imm8, 0 defword sub_reg64_reg64, 0 dq docol dq roll3, rex_w, lit, 0x2B, pack8, unroll3 - dq swap, reg64, swap, modrm_reg64 + dq swap, reg64, swap, addressing_reg64 ; Stack: ; output point @@ -3147,7 +3150,7 @@ defword sub_reg64_reg64, 0 defword sub_indirect_reg64_reg64, 0 dq docol dq roll3, rex_w, lit, 0x2B, pack8, unroll3 - dq swap, reg64, swap, modrm_indirect_reg64 + dq swap, reg64, swap, addressing_indirect_reg64 ; Stack: ; output point @@ -3156,7 +3159,7 @@ defword sub_indirect_reg64_reg64, 0 defword mul_reg64_reg64, 0 dq docol dq roll3, rex_w, lit, 0xF7, pack8, unroll3 - dq swap, reg64, swap, modrm_reg64 + dq swap, reg64, swap, addressing_reg64 dq exit ; The dividend is 128 bits, and is formed from rdx as the high half and rax @@ -3172,7 +3175,7 @@ defword mul_reg64_reg64, 0 defword divmod_reg64, 0 dq docol dq swap, rex_w, lit, 0xF7, pack8, swap - dq lit, 6, swap, modrm_reg64 + dq lit, 6, swap, addressing_reg64 ; Same as divmod, but signed. ; @@ -3182,19 +3185,23 @@ defword divmod_reg64, 0 defword idivmod_reg64, 0 dq docol dq swap, rex_w, lit, 0xF7, pack8, swap - dq lit, 7, swap, modrm_reg64 + dq lit, 7, swap, addressing_reg64 ; Stack: ; output point ; target register name defword inc_reg64, 0 - dq docol, swap, rex_w, lit, 0xFF, pack8, swap, lit, 0, swap, modrm_reg64 + dq docol + dq swap, rex_w, lit, 0xFF, pack8, swap, lit, 0, swap, addressing_reg64 + dq exit ; Stack: ; output point ; target register name defword dec_reg64, 0 - dq docol, swap, rex_w, lit, 0xFF, pack8, swap, lit, 1, swap, modrm_reg64 + dq docol + dq swap, rex_w, lit, 0xFF, pack8, swap, lit, 1, swap, addressing_reg64 + dq exit ; Stack: ; output point @@ -3203,7 +3210,7 @@ defword dec_reg64, 0 defword and_reg64_reg64, 0 dq docol dq roll3, rex_w, lit, 0x23, pack8, unroll3 - dq reg64, swap, modrm_reg64 + dq reg64, swap, addressing_reg64 dq exit ; Stack: @@ -3213,7 +3220,7 @@ defword and_reg64_reg64, 0 defword and_reg64_imm8, 0 dq docol dq roll3, rex_w, lit, 0x83, pack8, swap - dq lit, 4, swap, modrm_reg64 + dq lit, 4, swap, addressing_reg64 dq swap, pack8 dq exit @@ -3224,7 +3231,7 @@ defword and_reg64_imm8, 0 defword or_reg64_reg64, 0 dq docol dq roll3, rex_w, lit, 0x0B, pack8, unroll3 - dq reg64, swap, modrm_reg64 + dq reg64, swap, addressing_reg64 dq exit ; Stack: @@ -3234,7 +3241,7 @@ defword or_reg64_reg64, 0 defword or_reg64_imm8, 0 dq docol dq roll3, rex_w, lit, 0x83, pack8, swap - dq lit, 1, swap, modrm_reg64 + dq lit, 1, swap, addressing_reg64 dq swap, pack8 dq exit @@ -3245,7 +3252,7 @@ defword or_reg64_imm8, 0 defword xor_reg64_reg64, 0 dq docol dq roll3, rex_w, lit, 0x33, pack8, unroll3 - dq reg64, swap, modrm_reg64 + dq reg64, swap, addressing_reg64 dq exit ; Stack: @@ -3254,7 +3261,7 @@ defword xor_reg64_reg64, 0 defword not_reg64, 0 dq docol dq swap, rex_w, lit, 0xF7, pack8 - dq swap, lit, 2, swap, modrm_reg64 + dq swap, lit, 2, swap, addressing_reg64 dq exit ; Stack: @@ -3264,7 +3271,7 @@ defword not_reg64, 0 defword cmp_reg64_reg64, 0 dq docol dq roll3, rex_w, 0x3B, pack8, unroll3 - dq swap, reg64, swap, modrm_reg64 + dq swap, reg64, swap, addressing_reg64 dq exit ; Stack: @@ -3274,7 +3281,7 @@ defword cmp_reg64_reg64, 0 defword test_reg64_reg64, 0 dq docol dq roll3, rex_w, 0x85, pack8, unroll3 - dq swap, reg64, swap, modrm_reg64 + dq swap, reg64, swap, addressing_reg64 dq exit ; Stack: @@ -3283,7 +3290,7 @@ defword test_reg64_reg64, 0 defword jmp_abs_indirect_reg64, 0 dq docol dq swap, lit, 0xFF, pack8, swap - dq lit, 4, swap, modrm_indirect_reg64 + dq lit, 4, swap, addressing_indirect_reg64 dq exit ; Stack: |