FASM vc Проблема перевода MASM в mov si, offset msg

только что провел свой первый тест с 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 

person Ruben Trancoso    schedule 05.06.2010    source источник


Ответы (2)


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

person janequorzar    schedule 16.09.2010

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

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

person filofel    schedule 05.06.2010
comment
Я сказал это о бинарнике, который создал компоновщик. Объект пока не проверял. Это должна быть MBR, поэтому так и должно быть. Я использую пакет masm32, поэтому link16 является компоновщиком. Посмотрю, как определить такой сегмент, когда я новичок в этой среде :) - person Ruben Trancoso; 05.06.2010
comment
нашел кое-что хорошее... все документы MASM расположены по адресу web.sau.edu/LillisKevinM/csci240 /masmdocs - person Ruben Trancoso; 06.06.2010