Differenza in endianness tra sistemi operativi [chiuso]

2

C'è un assemblatore che sto scrivendo che si trova all'interno del file asm.c che si trova in questo repository . Utilizza il set di istruzioni situato nel file specs per produrre un binario di output. (Il programma che eseguirà questo binario non è ancora stato creato - l'inizio si trova in main.c .) Usando il programma di esempio chiamato echochar.sdmasm , l'assemblatore emette il binario desiderato. Qui è in esadecimale:

90 00 a0 00

Ma lo fa solo finora su una macchina Windows sotto Cygwin. (Non l'ho ancora testato sotto Linux.) Su un Mac basato su Intel, questo è il binario risultante:

00 90 00 a0

Questa sembra una differenza in endianness, ma ho pensato che ciò potesse accadere solo quando due processori sono completamente diversi. Questa sembra essere ed endian differenza tra sistemi operativi, non processori. È proprio così, o c'è qualcos'altro qui che non sto ottenendo?

È appena riuscito a testarlo su Linux - l'errore di output si verifica come avviene su Mac.

Ok, qualcos'altro sta succedendo del tutto. Uscita da hd su Linux:

00000000  00 90 00 a0                                       |....|
00000004

Output da hexdump su Linux:

0000000 9000 a000                              
0000004

Questo è davvero dispari. Non riesco a stabilire quale sia l'output corretto.

    
posta LordCreepity 11.12.2015 - 18:51
fonte

2 risposte

2

Qualcos'altro sta succedendo, probabilmente un bug nel codice.

Mi sembra un errore per errore, non un cambiamento di endianness.

Verifica la larghezza del tuo testo e i tuoi spostamenti di bit.

    
risposta data 11.12.2015 - 19:22
fonte
0

Dato il tuo output atteso come mostrato sopra (ad esempio 90 00 ecc.), il tuo codice non è corretto - si presuppone che sia in esecuzione su una macchina big-endian. Suggerirei di cambiare il tuo fwrite in un paio di chiamate fputc, o in alternativa di assemblare le istruzioni byte per byte in un array di uint8_t.

Per quanto riguarda le discrepanze dell'output, sembra che alcuni dei programmi di visualizzazione che si stanno utilizzando leggano parole a 16 bit in modalità little-endian e altre leggano byte per byte, quindi la discrepanza. Ciò è reso più confuso dal fatto che il tuo output non è quello che ti aspetti, probabilmente causando la ricerca nel posto sbagliato per il problema.

    
risposta data 11.12.2015 - 22:44
fonte

Leggi altre domande sui tag