2010-06-05 6 views
4

только что провела мой первый тест с MASM и FASM с тем же кодом (almos), и я попал в беду. Единственное различие заключается в том, что для создания только 104 байтов, которые мне нужно записать в MBR в FASM, я ставлю org 7c00h и в MASM 0h.Проблема FasM vc MASM trasnlation в mov si, offset msg

Проблема заключается в

mov si, offset msg 
в

, что в первом случае transletes его до 44 7С (7c44h) и MASM переводит 44 00 (0044h)! но только когда я меняю org 7c00h на org 0h в MASM. В противном случае он будет производить весь сегмент от 0 до 7dff.

Как его решить?

или, короче говоря, как сделать MASM производным двоичным кодом, который начинается с 7c00h, поскольку первый байт и последующие прыжки остаются относительно 7c00h?

.model TINY 
.code 
org    7c00h    ; Boot entry point. Address 07c0:0000 on the computer memory 
xor ax, ax   ; Zero out ax 
mov ds, ax  ; Set data segment to base of RAM 
jmp start  ; Jump to the first byte after DOS boot record data  

; ---------------------------------------------------------------------- 
; DOS boot record data 
; ---------------------------------------------------------------------- 
brINT13Flag  db  90h    ; 0002h - 0EH for INT13 AH=42 READ 
brOEM   db  'MSDOS5.0'  ; 0003h - OEM name & DOS version (8 chars) 
brBPS   dw  512    ; 000Bh - Bytes/sector 
brSPC   db  1    ; 000Dh - Sectors/cluster 
brResCount  dw  1    ; 000Eh - Reserved (boot) sectors 
brFATs   db  2    ; 0010h - FAT copies 
brRootEntries dw  0E0h   ; 0011h - Root directory entries 
brSectorCount dw  2880   ; 0013h - Sectors in volume, < 32MB 
brMedia   db  240    ; 0015h - Media descriptor 
brSPF   dw  9    ; 0016h - Sectors per FAT 
brSPH   dw  18    ; 0018h - Sectors per track 
brHPC   dw  2    ; 001Ah - Number of Heads 
brHidden  dd  0    ; 001Ch - Hidden sectors 
brSectors  dd  0    ; 0020h - Total number of sectors 
       db  0    ; 0024h - Physical drive no. 
       db  0    ; 0025h - Reserved (FAT32) 
       db  29h    ; 0026h - Extended boot record sig 
brSerialNum  dd  404418EAh  ; 0027h - Volume serial number (random) 
brLabel   db  'OSAdventure' ; 002Bh - Volume label (11 chars) 
brFSID   db  'FAT12 '  ; 0036h - File System ID (8 chars) 

;------------------------------------------------------------------------ 
; Boot code 
; ---------------------------------------------------------------------- 

start: 
mov si, offset msg 
call showmsg 
hang: 
jmp hang 

msg db 'Loading...',0 

showmsg: 
lodsb 
cmp al, 0 
jz showmsgd 
push si 
mov bx, 0007 
mov ah, 0eh 
int 10h 
pop si 
jmp showmsg 
showmsgd: 
retn 

; ---------------------------------------------------------------------- 
; Boot record signature 
; ---------------------------------------------------------------------- 
     dw 0AA55h      ; Boot record signature 
END 

ответ

1

Я немного изменил ваш код для работы с FASM. Надеюсь это поможет. Согласно Условиям обслуживания MS, вам не разрешено создавать ОС с MASM. Поэтому его не рекомендуется делать, а затем рекламировать в открытом чате. Но FASM отлично работает. Вот ваш код «исправлен», чтобы вы могли скомпилировать его в FASM.

use16 
format binary 

org 7c00h    ; Boot entry point. Address 07c0:0000 on the computer memory 

somelabel: 
xor ax, ax   ; Zero out ax 
mov ds, ax  ; Set data segment to base of RAM 
jmp start  ; Jump to the first byte after DOS boot record data  

; -------------------------------------- 
; DOS boot record data 
; -------------------------------------- 

brINT13Flag  db  90h    ; 0002h - 0EH for INT13 AH=42 READ 
brOEM   db  'FASMv1.6'  ; 0003h - OEM name & LOS version (8 chars) 
brBPS   dw  512    ; 000Bh - Bytes/sector 
brSPC   db  1    ; 000Dh - Sectors/cluster 
brResCount  dw  1    ; 000Eh - Reserved (boot) sectors 
brFATs   db  2    ; 0010h - FAT copies 
brRootEntries dw  0E0h   ; 0011h - Root directory entries 
brSectorCount dw  2880   ; 0013h - Sectors in volume, < 32MB 
brMedia   db  240    ; 0015h - Media descriptor 
brSPF   dw  9    ; 0016h - Sectors per FAT 
brSPH   dw  18    ; 0018h - Sectors per track 
brHPC   dw  2    ; 001Ah - Number of Heads 
brHidden  dd  0    ; 001Ch - Hidden sectors 
brSectors  dd  0    ; 0020h - Total number of sectors 
       db  0    ; 0024h - Physical drive no. 
       db  0    ; 0025h - Reserved (FAT32) 
       db  29h    ; 0026h - Extended boot record sig 
brSerialNum  dd  404F18EAh  ; 0027h - Volume serial number (random) 
brLabel   db  'FASM_DISK_1' ; 002Bh - Volume label (11 chars) 
brFSID   db  'FAT12 '  ; 0036h - File System ID (8 chars) 


;------------------------------------------- 
; Boot code 
; ------------------------------------------ 

msg1 db ' This is a test of FASM 1.6',0 

start: 
     mov  ax,msg1 
     MOV  si,ax 

display11: 
lodsb 
test al, al 
jnz disp0 
     jmp finish 
disp0: 
mov ah, 0xE 
mov bx, 7 
int 10h 
     jmp display11 

finish: 
     jmp $ ;This tells times to compare the end here with the 
       ;beginning up there called somelabel (NOTE : entry by 
       ;itself is not allowed because FASM uses it.) 

; ------------------------------------ 
; Boot record signature 
; ------------------------------------ 

size equ $ + somelabel 

times (512 - size - 2) db 0 ;needed to padd the first 512 sector with 0's 

           ;AFTER the jmp $ command. (size equ $+entry) 

           ;then is takes size away from 512 as well as 

           ;takes 2 bytes away for the boot sig and your done. 


     dw 0AA55h    ; Boot record signature 

Compile, что с FASM 1.6+ и это сделает само название файла, который вы называете его, а также сделать его в файл BIN. Я использую PowerISO для создания образов компакт-дисков, и он позволяет вам вставлять BIN-файл, чтобы вы могли сделать компакт-диск загрузочным. (СОВЕТ: Он покажет, что на ваш выбор только файлы BIF, просто выберите . и выберите файл BIN в любом случае, и вы туда.) Затем используйте бесплатную виртуальную виртуальную машину VM для монтирования и тестирования компакт-диска. :-)

0

Я не мои MASM документы и/или собственный исходный код под рукой, но я думаю, что вы должны определить сегмент AT 07C00 (так называемый абсолютный сегмент). И последовательно добавьте ENDS в конце ...

Теперь вы проверили фактический код бина, который запускался ваш MASM? Поскольку шестнадцатеричные значения, отображаемые в списке MASM, необязательно идентичны тому, что он фактически генерировал. Как вы его определили, вы создали перемещаемый сегмент кода с кодом, начинающимся с 07C00 в сегменте. Теперь вам нужна ссылка для создания фактического двоичного кода, и связанный код может быть прав - или почти прав: может быть, что компоновщик генерирует нули от 0000 до 07C00 в абсолютном целевом модуле. Вам нужно связаться с биндом, кстати. Не уверен, что ссылка на «.com» сделает это. Какой 16-битный компоновщик вы используете? Я использую Digital Mars Optasm (который вы можете свободно загрузить в своем бесплатном пакете компиляторов C).

+0

Я сказал это о бинарнике, который создал компоновщик. Еще не проверял объект. Это должно быть MBR, поэтому это должно быть так. Я использую пакет masm32, поэтому link16 является компоновщиком. Посмотрите, как определить такой сегмент, как только я буду таким новым в этой среде :) –

+0

нашел хороший материал ... все документы MASM установлены на http://web.sau.edu/LillisKevinM/csci240/masmdocs / –

 Смежные вопросы

  • Нет связанных вопросов^_^