4日目のアセンブラをダンプ(後編) - HobbyOSs/opennask GitHub Wiki
- そろそろ画面が見えるようになってきた、嬉しいけど先を急ぐ
新規の命令だけピックアップ
naskfunc.nas
; naskfunc
; TAB=4
[FORMAT "WCOFF"] ; オブジェクトファイルを作るモード
[INSTRSET "i486p"] ; 486の命令まで使いたいという記述
[BITS 32] ; 32ビットモード用の機械語を作らせる
[FILE "naskfunc.nas"] ; ソースファイル名情報
GLOBAL _io_hlt, _io_cli, _io_sti, _io_stihlt
GLOBAL _io_in8, _io_in16, _io_in32
GLOBAL _io_out8, _io_out16, _io_out32
GLOBAL _io_load_eflags, _io_store_eflags
[SECTION .text]
_io_hlt: ; void io_hlt(void);
HLT
RET
_io_cli: ; void io_cli(void);
CLI
RET
_io_sti: ; void io_sti(void);
STI
RET
_io_stihlt: ; void io_stihlt(void);
STI
HLT
RET
_io_in8: ; int io_in8(int port);
MOV EDX,[ESP+4] ; port
MOV EAX,0
IN AL,DX
RET
_io_in16: ; int io_in16(int port);
MOV EDX,[ESP+4] ; port
MOV EAX,0
IN AX,DX
RET
_io_in32: ; int io_in32(int port);
MOV EDX,[ESP+4] ; port
IN EAX,DX
RET
_io_out8: ; void io_out8(int port, int data);
MOV EDX,[ESP+4] ; port
MOV AL,[ESP+8] ; data
OUT DX,AL
RET
_io_out16: ; void io_out16(int port, int data);
MOV EDX,[ESP+4] ; port
MOV EAX,[ESP+8] ; data
OUT DX,AX
RET
_io_out32: ; void io_out32(int port, int data);
MOV EDX,[ESP+4] ; port
MOV EAX,[ESP+8] ; data
OUT DX,EAX
RET
_io_load_eflags: ; int io_load_eflags(void);
PUSHFD ; PUSH EFLAGS という意味
POP EAX
RET
_io_store_eflags: ; void io_store_eflags(int eflags);
MOV EAX,[ESP+4]
PUSH EAX
POPFD ; POP EFLAGS という意味
RET
- FAT12のファイルの並びがうまくいかない
- 8byte以上のシンボル名は最後の方に集合している
基本構造
struct NAS_PIMAGE_SYMBOL {
uint8_t shortName[8];
uint32_t value;
uint16_t sectionNumber;
uint16_t type;
uint8_t storageClass;
uint8_t numberOfAuxSymbols;
} __attribute__((packed));
- 8byte以下のシンボル
PIMAGE_SYMBOL
のshortName
部分にシンボルを含ませて書き込む
- 8byteより大きいシンボル
PIMAGE_SYMBOL
にはlongName
へのオフセットだけ入れて書き込む
最後に、8byteより大きいシンボルを 0x00
区切りでファイルの最後に書き込む
value
- シンボル〜シンボルまでのバイト数
- 例えば、
_io_hlt:
から_io_cli:
の間はHLT
とRET
しかないので 2byte
00000160: 0000 0000 0000 0000 0000 005f 696f 5f68 ..........._io_h
00000170: 6c74 0000 0000 0001 0000 0002 005f 696f lt..........._io
00000180: 5f63 6c69 0002 0000 0001 0000 0002 005f _cli..........._
00000190: 696f 5f73 7469 0004 0000 0001 0000 0002 io_sti..........
000001a0: 0000 0000 0004 0000 0006 0000 0001 0000 ................
000001b0: 0002 005f 696f 5f69 6e38 0009 0000 0001 ..._io_in8......
000001c0: 0000 0002 005f 696f 5f69 6e31 3614 0000 ....._io_in16...
000001d0: 0001 0000 0002 005f 696f 5f69 6e33 3220 ......._io_in32
000001e0: 0000 0001 0000 0002 005f 696f 5f6f 7574 ........._io_out
000001f0: 3826 0000 0001 0000 0002 0000 0000 000f 8&..............
00000200: 0000 0030 0000 0001 0000 0002 0000 0000 ...0............
00000210: 0019 0000 003b 0000 0001 0000 0002 0000 .....;..........
00000220: 0000 0023 0000 0045 0000 0001 0000 0002 ...#...E........
00000230: 0000 0000 0033 0000 0048 0000 0001 0000 .....3...H......
00000240: 0002 0044 0000 005f 696f 5f73 7469 686c ...D..._io_stihl
00000250: 7400 5f69 6f5f 6f75 7431 3600 5f69 6f5f t._io_out16._io_
00000260: 6f75 7433 3200 5f69 6f5f 6c6f 6164 5f65 out32._io_load_e
00000270: 666c 6167 7300 5f69 6f5f 7374 6f72 655f flags._io_store_
00000280: 6566 6c61 6773 00 eflags.
symbol_table
のサイズ:18byte
shortName
はそれぞれのものを8bytevalue
storageClass
が全てC_EXT
なので、ここは Relocatable address らしいsectionNumber
は全て0x0001
=.text
type
は全て0x0000
storageClass
は全て0x02
=C_EXT: External symbol
numberOfAuxSymbols
は全て0x00
0001020304050607 | 08090a0b | 0c0d | 0e0f | 10 | 11 || shortName | val |
---------------- | -------- | ---- | ---- | -- | -- || --------- | --- |
5f696f5f686c7400 | 00000000 | 0100 | 0000 | 02 | 00 || _io_hlt | 0 |
5f696f5f636c6900 | 02000000 | 0100 | 0000 | 02 | 00 || _io_cli | 2 |
5f696f5f73746900 | 04000000 | 0100 | 0000 | 02 | 00 || _io_sti | 4 |
0000000004000000 | 06000000 | 0100 | 0000 | 02 | 00 || | 6 |
5f696f5f696e3800 | 09000000 | 0100 | 0000 | 02 | 00 || _io_in8 | 9 |
5f696f5f696e3136 | 14000000 | 0100 | 0000 | 02 | 00 || _io_in16 | 20 |
5f696f5f696e3332 | 20000000 | 0100 | 0000 | 02 | 00 || _io_in32 | 32 |
5f696f5f6f757438 | 26000000 | 0100 | 0000 | 02 | 00 || _io_out8 | 38 |
000000000f000000 | 30000000 | 0100 | 0000 | 02 | 00 || | 48 |
0000000019000000 | 3b000000 | 0100 | 0000 | 02 | 00 || | 59 |
0000000023000000 | 45000000 | 0100 | 0000 | 02 | 00 || | 69 |
0000000033000000 | 48000000 | 0100 | 0000 | 02 | 00 || | 72 |
44000000
value
は、シンボル間のニーモニックのサイズを表しているようだ- シンボルテーブルは
_io_hlt
から始まっており、そこからどんどん機械語のサイズを加算してrelocatable address
とするようだ
- シンボルテーブルは
| shortName | val | 次のシンボルまでに入る機械語
| --------- | --- | -----------------------------
| _io_hlt | 0 | HLT, RET => 2byte
| _io_cli | 2 | CLI, RET => 2byte
| _io_sti | 4 | STI, RET => 2byte
| | 6 | STI, HLT, RET => 3byte
| _io_in8 | 9 |
| _io_in16 | 20 |
| _io_in32 | 32 |
| _io_out8 | 38 |
| | 48 |
| | 59 |
| | 69 |
| | 72 |