Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Levykkeen nimiö assemblyllä

dungeon86 [30.11.2004 15:15:34]

#

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ä!!!

arcatan [30.11.2004 16:13:29]

#

Valitettavasti minulle ei nyt selvinnyt, että millä rivillä se valittaa :(

sqwiik [30.11.2004 19:23:19]

#

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).

Metabolix [30.11.2004 19:56:18]

#

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.

sqwiik [30.11.2004 20:08:32]

#

Pieniä mokia :/ ...siitä on jonkin aikaa kun viimeksi käytin inline assembleria.

thefox [30.11.2004 20:43:00]

#

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).

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta