FASM vc MASM проблема переноса в MOV Si, смещение MSG - PullRequest
4 голосов
/ 05 июня 2010

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

Проблема в

mov si, offset msg

, что в первом случае переводит его в 44 7C (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 

Ответы [ 2 ]

1 голос
/ 16 сентября 2010

Я немного изменил ваш код для работы с 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

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

0 голосов
/ 05 июня 2010

У меня нет под рукой моих документов MASM и / или собственного исходного кода, но я думаю, что вы должны определить SEGMENT AT 07C00 (он же абсолютный сегмент). И последовательно добавьте КОНЕЦ в конце ...

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

...