2016-03-26 16 views
1

Kodun geri kalanı büyükken ilk sektör yalnızca 512 bayt olduğundan, .lst dosyası için ayrılmış bir assembler koduna ihtiyacım var. Bunun bağlayıcı olarak adlandırıldığından emin değilim, ancak NASM ile bir .img dosyası oluşturduğumda bu assembler dosyasını bağlamak istiyorum. İlkNasm ile iki .asm dosyasını ekleme

biri

ORG  0x7c00  
start: 
    JMP  entry 
    DB  0x90 
    ; Start of BIOS Parameter Block   
    DB  "MyOS "  
    DW  512   
    DB  1   
    DW  1   
    DB  2   
    DW  224   
    DW  2880    
    DB  0xf0    
    DW  9 
    DW  18   
    DW  2   
    DD  0   
    DD  2880    
    DB  0,0,0x29   
    DD  0xffffffff  
    DB  "MyOS-Vol "  
    DB  "FAT12 "  
    TIMES 18 DB 0   
    ; End of BIOS Parameter Block   

entry: 
    MOV  AX, 0   
    MOV  SS,AX 
    MOV  SP,0x7c00 
    MOV  DS,AX 
    MOV  ES,AX 
    MOV  SI,msg 
loop: 
    MOV  AL,BYTE [SI] 
    ADD  SI, 1   
    CMP  AL,0 
    JE  fin 
    MOV  AH, 0x0e   
    MOV  BX, 0xe1   
    INT  0x10    
    JMP  putloop 
fin: 
    HLT     
    JMP  fin   

msg: 
    DB  0x0a, 0x0a  
    DB  "hello, world" 
    DB  0x0a    
    DB  0 

maker:  
    TIMES 0x01fe-(maker-start) DB 0 
    DB  0x55, 0xaa  

ikinci

DB  0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 
TIMES 4600 DB 0 
DB  0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 
TIMES 1469432 DB 0 

biri nasıl birinci koduna ikinci kodu ekleyebilirsiniz? Metni kopyalayıp yapıştırarak değil, nesne dosyasını birbirine bağladığında olduğu gibi. FAT12 Disk formatı için arayanlar için


. DOS Boot Record Format for FAT12 and FAT16

+1

x86 PC donanımında önyükleme sınırlamaları hakkında konuşuyorsunuzdur. Öyküleri birleştirmenin sihirli bir yolu yoktur, böylece önyükleme sektöründe ve geri kalan kısımda ilk bölümünüz olabilir. Önyükleyici, ek kodun yüklenmesini üstlenmeli ve yürütmelidir. –

+0

Amacınızı aldım. Ben açıkça benim açıklamamış olduğunu düşünüyorum. Bunun için üzgünüm. Sormaya çalıştığım şey bu. Asm dosyalarını donanıma yüklemeden önce nasıl bağlarım? Derleyici, yürütülebilir dosyaları yapmadan önce nesne dosyalarını bağladığını biliyorum. Peki ya montajcı hakkında? Dosyayı okurken ve başka bir dosyayı string işlevi olarak ekleyerek küçük bir program hazırladım. Ama bu şekilde görünmüyor. Nazım için herhangi bir seçenek var mı? Ben bir tane bulamadık :( –

+1

Asm dosyanızın üstünde '0x7c00' org'unuz var demektir, o zaman kodunuzu '-f bin' seçeneği ile birleştiriyorsunuz ('nasm -f bin boot.asm' gibi) o boot.bin 'çıktısı '' nasm -f bin '' den gelen çıktı, geleneksel anlamda _linked_ olamayan, tam bağlantılı bir düz ikili görüntüdür.Tam yükleyiciye (genellikle _DD_ gibi bir araç ile) yazılır. Windows/OSX'de mi, Linux'ta mı? Hangi bağlayıcıyı kullanmak istiyorsunuz? (_LD_, _GCC_ vb.)? –

cevap

3

sadece iki montaj dosyalarını birlikte katılmak ve doğrudan disket görüntü üretmek için -f bin seçeneğiyle araya olacağını yapmanın en kolay yolu. listeleme dosyasının boyutu sorun olmayacak, ikinci dosya şöyle bir liste dosyası üretir:

 
    1 00000000 F0FFFF0000000000   DB  0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 
    2 00000008 00     TIMES 4600 DB 0 
    3 00001200 F0FFFF0000000000   DB  0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 
    4 00001208 00     TIMES 1469432 DB 0 

iki kaynak kod dosyaları saklamak istiyorsanız Nasm en %include direktifini kullanabilirsiniz ayırın:

%include "bootsector.asm" 
%include "fat12.asm" 

Alternatif cat komutuyla ikili bunları doğrudan montaj sonra birlikte iki dosya katılabilirsiniz:

nasm -f bin bootsector.asm -o bootsector.bin 
nasm -f bin fat12.asm -o fat12.bin 
cat bootsector.bin fat.bin > floppy.img 

Kendi dosyalarının dışındaki sembollere başvuran dosyaları birbirine bağlamadıkça disket resminizi oluşturmak için bir linker kullanmanız gerekmez. O zaman bile, her şeyi bir arada "bağla" için %include yönergesini kullanmak çok daha kolay olurdu. Linker rotasına gitmek, bu durumda sorun olmayacak bir linker betiğinin yazılması anlamına gelir.