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が選ばれる

他の命令もよくこんな感じで選ばれているっぽい