Opecode SUB - HobbyOSs/opennask GitHub Wiki
実はなかなか面倒な命令である
命令セット
0x2C ib SUB AL, imm8 ALからimm8を引きます
0x2D iw SUB AX, imm16 AXからimm16を引きます
0x2D id SUB EAX, imm32 EAXからimm32を引きます
0x80 /5 ib SUB r/m8, imm8 r/m8からimm8を引きます
0x81 /5 iw SUB r/m16, imm16 r/m16からimm16を引きます
0x81 /5 id SUB r/m32, imm32 r/m32からimm32を引きます
0x83 /5 ib SUB r/m16, imm8 r/m16から符号拡張したimm8を引きます
0x83 /5 ib SUB r/m32, imm8 r/m32から符号拡張したimm8を引きます
0x28 /r SUB r/m8, r8 r/m8からr8を引きます
0x29 /r SUB r/m16, r16 r/m16からr16を引きます
0x29 /r SUB r/m32, r32 r/m32からr32を引きます
0x2A /r SUB r8, r/m8 r8からr/m8を引きます
0x2B /r SUB r16, r/m16 r16からr/m16を引きます
0x2B /r SUB r32, r/m32 r32からr/m32を引きます
挙動
このような命令がOS自作では出てくる
SUB ECX,512/4 ; IPLの分だけ差し引く
SUB ECX,1
↓
SUB ECX,128 ; IPLの分だけ差し引く
SUB ECX,1
- naskを実行すると下記のような挙動になる
SUB ECX,128 ; 81 e9 80 00 00 00 => SUB r/m32, imm32... r/m32からimm32を引きます
SUB ECX,1 ; 83 e9 01 => SUB r/m32, imm8 ... r/m32から符号拡張したimm8を引きます
考察
SUB ECX,128
の場合、当てはまるニーモニックは下記の2択
0x81 /5 id SUB r/m32, imm32
0x83 /5 ib SUB r/m32, imm8
符号ありint8型は -127~+127
までの範囲しか使えず範囲を超えるとオーバーフローしてしまう
↓
よって、SUB r/m32, imm32
が選ばれる
他の命令もよくこんな感じで選ばれているっぽい