假設我有一些這樣的代碼:
_TEXT16 SEGMENT USE16 'CODE'
_start:
; some code...
; add padding
byte 512-($-_start) dup (0) ; works fine
_TEXT16 ENDS
_TEXT32 SEGMENT USE32 'CODE'
; some code
byte 1024-($-_start) dup (0) ; error A2192: Operands must be in same segment
_TEXT32 ENDS
在 NASM 中,您只需執行類似的操作times 1024-($-$$) db 0,但不幸的$$是,MASM 或 JWASM 不支持,這是我目前正在使用的。我需要它來將引導加載程式的塊與可讀磁盤扇區的大小對齊。
所以,我的問題是,如何在 MASM 中的代碼塊中添加 512 位元組的填充?
編輯:
場景發生了一些變化。
_TEXT16 SEGMENT USE16 'CODE'
_start:
; some code...
_TEXT16 ENDS
_TEXT32 SEGMENT USE32 'CODE'
; some code
_TEXT32 ENDS
_TEXT64 SEGMENT USE64 'CODE'
; some code
; add padding
byte 510-($-_start) dup (0) ; error A2192: Operands must be in same segment
dw 0AA55h
_TEXT64 ENDS
現在我將如何在這里添加正確的填充?
uj5u.com熱心網友回復:
好的,這很難解釋,但我終于解決了我的問題。
最終作業的代碼是這樣的:
.386P
.model TINY, C
_TEXT16 SEGMENT BYTE USE16 'CODE'
org 07C00h
begin16:
_start:
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov bp, 07C00h
mov sp, bp
mov ah, 0Eh
mov al, 'A'
mov bl, 0Fh
int 10h
cli
hlt
end16:
size16 equ end16 - begin16
_TEXT16 ENDS
_TEXT32 SEGMENT BYTE USE32 'CODE'
begin32:
start_protected_mode:
cli
hlt
end32:
size32 equ end32 - begin32
_TEXT32 ENDS
.x64
_TEXT64 SEGMENT BYTE USE64 'CODE'
begin64:
start_long_mode:
cli
hlt
end64:
size64 equ end64 - begin64
_TEXT64 ENDS
_BOOTDATA SEGMENT BYTE 'DATA'
begin_data:
bootDisk db ?
end_data:
size_data equ end_data - begin_data
_BOOTDATA ENDS
_PADDING SEGMENT BYTE
org (510 - size16 - size32 - size64 - size_data) ; either of these work
;byte (510 - size16 - size32 - size64 - size_data) dup(0) ; either of these work
dw 0AA55h
_PADDING ENDS
END _start
這里發生的事情如下。第一個org指令 ( org 07C00h) 設定程式的起始地址。它這樣做只是因為我們已經使用END指令告訴它,我們已經為代碼的開頭 ( END _start) 提供了一個標簽。如果您沒有為END指令提供代碼的說明標簽,則第一個org指令將被決議為在您的實際代碼之前的許多零。或者簡而言之,它實際上會通過你給它的任何值來抵消你的代碼。
然而,第二個org指令 ( org org (510 - size16 - size32 - size64 - size_data)) 就像一個偏移量,即使你沒有給END指令一個標簽。
考慮到所有這些,我們的結果如下所示:
00000000 33C0 xor ax,ax
00000002 8ED8 mov ds,ax
00000004 8EC0 mov es,ax
00000006 8ED0 mov ss,ax
00000008 BD007C mov bp,0x7c00
0000000B 8BE5 mov sp,bp
0000000D B40E mov ah,0xe
0000000F B041 mov al,0x41
00000011 B30F mov bl,0xf
00000013 CD10 int 0x10
00000015 FA cli
00000016 F4 hlt
00000017 FA cli
00000018 F4 hlt
00000019 FA cli
0000001A F4 hlt
0000001B 0000 add [bx si],al
0000001D 0000 add [bx si],al
0000001F 0000 add [bx si],al
00000021 0000 add [bx si],al
00000023 0000 add [bx si],al
00000025 0000 add [bx si],al
00000027 0000 add [bx si],al
00000029 0000 add [bx si],al
0000002B 0000 add [bx si],al
0000002D 0000 add [bx si],al
0000002F 0000 add [bx si],al
00000031 0000 add [bx si],al
00000033 0000 add [bx si],al
00000035 0000 add [bx si],al
00000037 0000 add [bx si],al
00000039 0000 add [bx si],al
0000003B 0000 add [bx si],al
0000003D 0000 add [bx si],al
0000003F 0000 add [bx si],al
00000041 0000 add [bx si],al
00000043 0000 add [bx si],al
00000045 0000 add [bx si],al
00000047 0000 add [bx si],al
00000049 0000 add [bx si],al
0000004B 0000 add [bx si],al
0000004D 0000 add [bx si],al
0000004F 0000 add [bx si],al
00000051 0000 add [bx si],al
00000053 0000 add [bx si],al
00000055 0000 add [bx si],al
00000057 0000 add [bx si],al
00000059 0000 add [bx si],al
0000005B 0000 add [bx si],al
0000005D 0000 add [bx si],al
0000005F 0000 add [bx si],al
00000061 0000 add [bx si],al
00000063 0000 add [bx si],al
00000065 0000 add [bx si],al
00000067 0000 add [bx si],al
00000069 0000 add [bx si],al
0000006B 0000 add [bx si],al
0000006D 0000 add [bx si],al
0000006F 0000 add [bx si],al
00000071 0000 add [bx si],al
00000073 0000 add [bx si],al
00000075 0000 add [bx si],al
00000077 0000 add [bx si],al
00000079 0000 add [bx si],al
0000007B 0000 add [bx si],al
0000007D 0000 add [bx si],al
0000007F 0000 add [bx si],al
00000081 0000 add [bx si],al
00000083 0000 add [bx si],al
00000085 0000 add [bx si],al
00000087 0000 add [bx si],al
00000089 0000 add [bx si],al
0000008B 0000 add [bx si],al
0000008D 0000 add [bx si],al
0000008F 0000 add [bx si],al
00000091 0000 add [bx si],al
00000093 0000 add [bx si],al
00000095 0000 add [bx si],al
00000097 0000 add [bx si],al
00000099 0000 add [bx si],al
0000009B 0000 add [bx si],al
0000009D 0000 add [bx si],al
0000009F 0000 add [bx si],al
000000A1 0000 add [bx si],al
000000A3 0000 add [bx si],al
000000A5 0000 add [bx si],al
000000A7 0000 add [bx si],al
000000A9 0000 add [bx si],al
000000AB 0000 add [bx si],al
000000AD 0000 add [bx si],al
000000AF 0000 add [bx si],al
000000B1 0000 add [bx si],al
000000B3 0000 add [bx si],al
000000B5 0000 add [bx si],al
000000B7 0000 add [bx si],al
000000B9 0000 add [bx si],al
000000BB 0000 add [bx si],al
000000BD 0000 add [bx si],al
000000BF 0000 add [bx si],al
000000C1 0000 add [bx si],al
000000C3 0000 add [bx si],al
000000C5 0000 add [bx si],al
000000C7 0000 add [bx si],al
000000C9 0000 add [bx si],al
000000CB 0000 add [bx si],al
000000CD 0000 add [bx si],al
000000CF 0000 add [bx si],al
000000D1 0000 add [bx si],al
000000D3 0000 add [bx si],al
000000D5 0000 add [bx si],al
000000D7 0000 add [bx si],al
000000D9 0000 add [bx si],al
000000DB 0000 add [bx si],al
000000DD 0000 add [bx si],al
000000DF 0000 add [bx si],al
000000E1 0000 add [bx si],al
000000E3 0000 add [bx si],al
000000E5 0000 add [bx si],al
000000E7 0000 add [bx si],al
000000E9 0000 add [bx si],al
000000EB 0000 add [bx si],al
000000ED 0000 add [bx si],al
000000EF 0000 add [bx si],al
000000F1 0000 add [bx si],al
000000F3 0000 add [bx si],al
000000F5 0000 add [bx si],al
000000F7 0000 add [bx si],al
000000F9 0000 add [bx si],al
000000FB 0000 add [bx si],al
000000FD 0000 add [bx si],al
000000FF 0000 add [bx si],al
00000101 0000 add [bx si],al
00000103 0000 add [bx si],al
00000105 0000 add [bx si],al
00000107 0000 add [bx si],al
00000109 0000 add [bx si],al
0000010B 0000 add [bx si],al
0000010D 0000 add [bx si],al
0000010F 0000 add [bx si],al
00000111 0000 add [bx si],al
00000113 0000 add [bx si],al
00000115 0000 add [bx si],al
00000117 0000 add [bx si],al
00000119 0000 add [bx si],al
0000011B 0000 add [bx si],al
0000011D 0000 add [bx si],al
0000011F 0000 add [bx si],al
00000121 0000 add [bx si],al
00000123 0000 add [bx si],al
00000125 0000 add [bx si],al
00000127 0000 add [bx si],al
00000129 0000 add [bx si],al
0000012B 0000 add [bx si],al
0000012D 0000 add [bx si],al
0000012F 0000 add [bx si],al
00000131 0000 add [bx si],al
00000133 0000 add [bx si],al
00000135 0000 add [bx si],al
00000137 0000 add [bx si],al
00000139 0000 add [bx si],al
0000013B 0000 add [bx si],al
0000013D 0000 add [bx si],al
0000013F 0000 add [bx si],al
00000141 0000 add [bx si],al
00000143 0000 add [bx si],al
00000145 0000 add [bx si],al
00000147 0000 add [bx si],al
00000149 0000 add [bx si],al
0000014B 0000 add [bx si],al
0000014D 0000 add [bx si],al
0000014F 0000 add [bx si],al
00000151 0000 add [bx si],al
00000153 0000 add [bx si],al
00000155 0000 add [bx si],al
00000157 0000 add [bx si],al
00000159 0000 add [bx si],al
0000015B 0000 add [bx si],al
0000015D 0000 add [bx si],al
0000015F 0000 add [bx si],al
00000161 0000 add [bx si],al
00000163 0000 add [bx si],al
00000165 0000 add [bx si],al
00000167 0000 add [bx si],al
00000169 0000 add [bx si],al
0000016B 0000 add [bx si],al
0000016D 0000 add [bx si],al
0000016F 0000 add [bx si],al
00000171 0000 add [bx si],al
00000173 0000 add [bx si],al
00000175 0000 add [bx si],al
00000177 0000 add [bx si],al
00000179 0000 add [bx si],al
0000017B 0000 add [bx si],al
0000017D 0000 add [bx si],al
0000017F 0000 add [bx si],al
00000181 0000 add [bx si],al
00000183 0000 add [bx si],al
00000185 0000 add [bx si],al
00000187 0000 add [bx si],al
00000189 0000 add [bx si],al
0000018B 0000 add [bx si],al
0000018D 0000 add [bx si],al
0000018F 0000 add [bx si],al
00000191 0000 add [bx si],al
00000193 0000 add [bx si],al
00000195 0000 add [bx si],al
00000197 0000 add [bx si],al
00000199 0000 add [bx si],al
0000019B 0000 add [bx si],al
0000019D 0000 add [bx si],al
0000019F 0000 add [bx si],al
000001A1 0000 add [bx si],al
000001A3 0000 add [bx si],al
000001A5 0000 add [bx si],al
000001A7 0000 add [bx si],al
000001A9 0000 add [bx si],al
000001AB 0000 add [bx si],al
000001AD 0000 add [bx si],al
000001AF 0000 add [bx si],al
000001B1 0000 add [bx si],al
000001B3 0000 add [bx si],al
000001B5 0000 add [bx si],al
000001B7 0000 add [bx si],al
000001B9 0000 add [bx si],al
000001BB 0000 add [bx si],al
000001BD 0000 add [bx si],al
000001BF 0000 add [bx si],al
000001C1 0000 add [bx si],al
000001C3 0000 add [bx si],al
000001C5 0000 add [bx si],al
000001C7 0000 add [bx si],al
000001C9 0000 add [bx si],al
000001CB 0000 add [bx si],al
000001CD 0000 add [bx si],al
000001CF 0000 add [bx si],al
000001D1 0000 add [bx si],al
000001D3 0000 add [bx si],al
000001D5 0000 add [bx si],al
000001D7 0000 add [bx si],al
000001D9 0000 add [bx si],al
000001DB 0000 add [bx si],al
000001DD 0000 add [bx si],al
000001DF 0000 add [bx si],al
000001E1 0000 add [bx si],al
000001E3 0000 add [bx si],al
000001E5 0000 add [bx si],al
000001E7 0000 add [bx si],al
000001E9 0000 add [bx si],al
000001EB 0000 add [bx si],al
000001ED 0000 add [bx si],al
000001EF 0000 add [bx si],al
000001F1 0000 add [bx si],al
000001F3 0000 add [bx si],al
000001F5 0000 add [bx si],al
000001F7 0000 add [bx si],al
000001F9 0000 add [bx si],al
000001FB 0000 add [bx si],al
000001FD 0055AA add [di-0x56],dl
如您所見,我必須通過在其開頭和結尾使用標簽來計算每個段的大小。然后我為這些大小設定了一些常量。如果您問自己,為什么我不在代碼的開頭放一個標簽,在代碼的末尾放一個標簽?那么我必須告訴你,你只能將標簽放在段中,并且只能從同一段中訪問它們。因此是常數,計算每個常數的大小。
所以總而言之:
- 如果您為代碼的開頭提供標簽,則第一個
org設定程式偏移量END org無論如何,以下所有指令都將充當偏移量- 將你
SEGMENT的 s 與BYTEs對齊 - 并做一些不斷的標簽計算黑客來獲得正確的偏移量
請不要完全相信我的話。這只是許多測驗的結果。如果您有任何疑問,請隨時發表評論。
否則,我希望這對找到這個的人有所幫助。
uj5u.com熱心網友回復:
也許使用org 510或org 510 7C00h尋求到那一點?
NASM 的檔案特別提到 NASM 不支持 MASMorg指令允許的那種詭計,這意味著 MASMorg 可用于此目的。NASM 檔案甚至顯示了一個 MASM 示例:
; MASM example from the NASM manual
ORG 0
; some boot sector code
ORG 510
DW 0xAA55
我不知道這可能如何與多個細分市場互動。OP 報告說這僅適用于同一段內org的兩個指令。也許有一種方法可以指定段的來源作為宣告它的一部分?
或者也許是另一種選擇,在您沒有將它們填充到固定大小的情況下,您能否要求 MASM 計算這些早期段的大小?(當大小固定時,事情顯然很簡單:你只需在第一個 512 位元組段之后將第二段設為 512 位元組,因此它將以 1024 結束。)
像byte 510 - sizeof _TEXT16 -($-_start) dup (0)或類似的東西也減去前面段的長度?我不知道 MASM 是否允許這樣做。顯然這不起作用,所以也許在前面的兩個部分中定義一個equ或或一些東西。size16 = $-start16
無論哪種方式,都不會考慮段之間的填充,如果有任何對齊它們的開始。
或者,當然,如果您不知道如何讓匯編器為您執行此操作,作為構建程序的一部分,您當然可以將引導簽名單獨附加到匯編器的平面二進制輸出中。
在 Linux shell 中,此命令打開boot.bin,尋找位元組 510,并寫入db 0x55, 0xaa
echo -ne '\x55\xAA' | dd of=boot.bin conv=notrunc bs=2 count=1 seek=$((510/2))
如果您在使用 Windows 時遇到問題,則 有的埠,dd例如http://www.chrysocome.net/downloads/dd-0.6beta3.src.zip因為將查找視為多個塊,而不是位元組。而且我不知道如何在 Windows 上傳輸任意二進制資料;如果你已經安裝了它,或者只是使用匯編程式創建一個 2 位元組檔案。bashzsh$((510/2))seek=255ddpython
dd.exe if=aa55.bin of=boot.bin conv=notrunc bs=2 count=1 seek=255
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/524676.html
標籤:Intel Collective 部件x86masm引导加载程序操作系统开发
