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.