该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
各位前辈好,
我是一个刚买了《30天自制操作系统》的汇编小白。这本书里最开始讲的是汇编的一些内容,我有点不太明白,烦请各位指点一下:
这是原书光盘的汇编代码:
===========================================================
; hello-os
; TAB=4
ORG 0x7c00
JMP entry
DB 0x90
DB "HELLOIPL"
DW 512
DB 1
DW 1
DB 2
DW 224
DW 2880
DB 0xf0
DW 9
DW 18
DW 2
DD 0
DD 2880
DB 0,0,0x29
DD 0xffffffff
DB "HELLO-OS "
DB "FAT12 "
RESB 18
; プログラム本体
entry:
MOV AX,0 ; レジスタ初期化
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
MOV ES,AX
MOV SI,msg
putloop:
MOV AL,[SI]
ADD SI,1 ; SIに1を足す
CMP AL,0
JE fin
MOV AH,0x0e ; 一文字表示ファンクション
MOV BX,15 ; カラーコード
INT 0x10 ; ビデオBIOS呼び出し
JMP putloop
fin:
HLT ; 何かあるまでCPUを停止させる
JMP fin ; 無限ループ
msg:
DB 0x0a, 0x0a ; 改行を2つ
DB "hello, world"
DB 0x0a ; 改行
DB 0
RESB 0x7dfe-$ ; 0x7dfeまでを0x00で埋める命令
DB 0x55, 0xaa
; 以下はブートセクタ以外の部分の記述
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 4600
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432
===========================================================
这一章是介绍汇编指令都是什么意思的。然后书中说 JMP entry其实可以写成 JMP 0x7c50……我这里就懵了……
不是因为不知道entry这个是什么,是不知道这0x7c50的地址是怎么得到的……如果说是直到entry标签处算出来的,那1+8+2+1+2+1+2+2+1+2+2+2+4+4+4+4+10+7+18 = 77 也就是 4D吧……那按说应该是0xc4d才对啊……
另外书中还说MOV SI, msg 相当于MOV SI, 0x7c74……这个数我也不知道怎么来的……
你们都有什么比较快的“计算心法”么?……
此外MOV AL, [SI]是指将 SI中保存的地址 传给 AL……那MOV AL, SI会怎样?这里我也不太明白……
烦请各位解惑一下……
谢谢!