2010-06-05 3 views
4

MASM 및 FASM을 사용하여 동일한 코드 (almos)로 첫 테스트를했는데 문제가 발생했습니다. 유일한 차이점은 FASM에서 MBR에 쓸 필요가있는 104 바이트를 생성한다는 것입니다. org 7c00h와 MASM 0h를 넣었습니다.FASM vc MASM trasnlation 문제가 mov si, offset msg

문제는

mov si, offset msg 

에 상기 제 1 케이스 (44) 7C (7c44h)에 transletes MASM과 함께 44 00 (0044h)로 변환 안에 하지만 내가 MASM에서 조직 7c00h를 org 0h로 변경할 때. 그렇지 않으면 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을 사용하는 OS를 만들 수 없습니다. 따라서 채팅을하지 않고 공개 채팅으로 광고하는 것이 좋습니다. 그러나 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를 사용하여 CD 이미지를 만들면 CD를 부팅 가능하게 만들 수 있도록 BIN 파일을 가져올 수 있습니다. (힌트 : BIF 파일 만 선택한다는 것을 보여줄 것입니다. 을 선택하고 BIN 파일을 선택하십시오.) 그런 다음 무료 프로그램 VM VirtualBox를 사용하여 CD를 마운트하고 테스트하십시오. :-)

0

나는 편리 내 MASM 워드 프로세서 및/또는 자신의 소스 코드가없는,하지만 난 당신이 07C00 (일명 절대 세그먼트) AT 세그먼트를 정의해야합니다 생각합니다. 그리고 마지막에 일관되게 끝을 추가하십시오 ...

이제 MASM이 생성 한 실제 bin 코드를 확인 했습니까? MASM 목록에 표시된 16 진수 값은 실제 생성 된 것과 반드시 ​​동일하지 않기 때문에 당신이 정의한 방식대로 세그먼트의 07C00에서 시작하는 코드로 재배치 가능한 코드 세그먼트를 만들었습니다. 이제 실제 바이너리를 생성하기위한 링크가 필요하며 링크 된 코드는 오른쪽 또는 거의 맞을 수 있습니다. 절대 타겟 모듈에서 링커가 0000에서 07C00까지의 0을 생성 할 수 있습니다. bin, btw에 연결해야합니다. ".com"에 연결하는 것이 확실하지 않습니다. 어떤 16 비트 링커를 사용합니까? 나는 Digital Mars Optasm (무료 C 컴파일러 패키지에서 무료로 다운로드 할 수 있음)을 사용한다.

+0

나는 링커가 만든 바이너리에 대해 그렇게 말했다. obj를 아직 확인하지 않았습니다. MBR이기 때문에 이렇게해야합니다. masm32 패키지를 사용하므로 link16이 링커입니다. 그런 환경에 그런 새롭다면 그런 세그먼트를 정의하는 방법에 관해서 생각할 것이다 :) –

+0

는 좋은 재료를 찾아 냈다 ... 모든 MASM docs는 http://web.sau.edu/LillisKevinM/csci240/masmdocs에 놓았다 / –