Elikkä koodasin seuraavanlaisen pätkän, sen siis pitäisi lukea disketin label, mutta kääntäessä tulee seuraavanlainen ongelma:
C:\Borland>bcc32 testi.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
testi.c:
Warning W8002 testi.c 15: Restarting compile using assemble in function ReadSector
Turbo Assembler Version 5.0r Copyright (c) 1988, 1996 Borland International
Serial No: Tester:
Assembling file: testi.ASM
**Error** testi.ASM(51) Operand types do not match
Error messages: 1
Warning messages: None
Passes: 1
C:\Borland>
Se virhe ilmoitus oli siis siinä ja käytössä on edelleenkin Borlandin FreeCommandLineTools paketti ja TASM32
Ja ohjelmani koodit tulevat nyt tässä:
#include <stdio.h> #include "fmpldsk.c" unsigned char ReadSector(void *pBuffer, unsigned nDisk, unsigned nHead, unsigned nFirstSector, unsigned nCylinder) { RWBLOCK readBlock = {0}; unsigned char retVal = 0; readBlock.rwSectors = 1; readBlock.rwHead = nHead; readBlock.rwFirstSector = nFirstSector; readBlock.rwCylinder = nCylinder; readBlock.rwBuffer = pBuffer; asm { mov bx, nDisk; mov ch, 8h; mov cl, 61h; mov ax, 440dh; lea dx, readBlock; int 21h; jc err; jmp done; err:mov retVal, al; done: } return retVal; } void main(void) { BOOTSECTOR bootSector = {0}; unsigned char retVal; unsigned nHead = 0; unsigned nCylinder = 0; unsigned nDisk = 1; unsigned nFirstSector = 0; retVal = ReadSector(&bootSector, nDisk, nHead, nFirstSector, nCylinder); if(retVal != 0) printf("\nFailed to read the boot sector. Reason = %d \n", retVal); else { int i; printf("\n %x====%x ", bootSector.bsSecurityCode, bootSector.bsBootSignature); for(i=0;i<11;i++) printf("%c", bootSector.bsVolumeLabel[i]); } }
Ja tässä siihen linkitetty tiedosto:
#include <dos.h> #pragma warning (disable:4103) #pragma pack(1) typedef struct RWBLOCK_TAG { unsigned char rwSpecFunc; unsigned int rwHead; unsigned int rwCylinder; unsigned int rwFirstSector; unsigned int rwSectors; char _FAR *rwBuffer; } RWBLOCK; typedef struct { unsigned char bsJump[3]; unsigned char bsOemName[8]; unsigned int bsBytesPerSec; unsigned char bsSecPerClust; unsigned int bsResSectors; unsigned char bsFATs; unsigned int bsRootDirEnts; unsigned int bsSectors; unsigned char bsMedia; unsigned int bsFATsecs; unsigned int bsSecPerTrack; unsigned int bsHeads; unsigned long bsHiddenSecs; unsigned long bsHugeSectors; unsigned char bsDriveNumber; unsigned char bsReserved1; unsigned char bsBootSignature; unsigned long bsVolumeID; unsigned char bsVolumeLabel[11]; unsigned char bsFileSysType[8]; unsigned char bsBootCode[448]; unsigned int bsSecurityCode; } BOOTSECTOR; typedef struct { unsigned char peBootable; unsigned char peBeginHead; unsigned char peBeginSector; unsigned char peBeginCylinder; unsigned char peFileSystem; unsigned char peEndHead; unsigned char peEndSector; unsigned char peEndCylinder; unsigned long peStartSector; unsigned long peSectors; } PARTENTRY; typedef struct { unsigned char bootCode[448]; PARTENTRY pe[4]; } PARTITIONSECTOR; typedef struct { unsigned char entry[512]; } FATSECTOR;
ELI MIKÄ VIKANA????
PS. Tähän meni koko elämä!!!
Valitettavasti minulle ei nyt selvinnyt, että millä rivillä se valittaa :(
DSword - siinähän se oli, asm-kääntäjä inisee rivistä 15 (mov dx, readBlock).
Hmm... jos yrittäisit käyttää suoran muuttujaviittauksen sijaan osoitetta eli &readBlock? Ainakaan minun mielestäni RWBLOCK-rakenne ei ole samaa tyyppiä kuin dx-rekisteri (rivillä 15).
Näin asmia kummemmin tuntematta sanoisin, että tuo voisi korjautua muuttamalla riville lea dx, readBlock;
32-bittinen rekisteri 16-bittisen sijaan: lea edx, readBlock;
Sqwiik: Eihän tuolla ole riviä mov dx, readBlock
, ja rivin 15 aiheuttama varoitus sanoo, että kääntäjäksi vaihdetaan TASM32.
Pieniä mokia :/ ...siitä on jonkin aikaa kun viimeksi käytin inline assembleria.
Turha edes yrittää virittää tuota koodia toimimaan Windowsilla. Vaikka saisitkin sen kääntymään, se ei tule toimimaan. Hanki jotain Windows-ystävällistä (eli ei keskeytyskutsuja).
Aihe on jo aika vanha, joten et voi enää vastata siihen.