4日目のアセンブラをダンプ(後編) - HobbyOSs/opennask GitHub Wiki

  • そろそろ画面が見えるようになってきた、嬉しいけど先を急ぐ

新規の命令だけピックアップ

; 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_SYMBOLshortName 部分にシンボルを含ませて書き込む
  • 8byteより大きいシンボル
    • PIMAGE_SYMBOL には longName へのオフセットだけ入れて書き込む

最後に、8byteより大きいシンボルを 0x00 区切りでファイルの最後に書き込む

  • value
    • シンボル〜シンボルまでのバイト数
    • 例えば、 _io_hlt: から _io_cli: の間は HLTRET しかないので 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 はそれぞれのものを8byte
    • value 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 |