Direttiva BYTE in assembly [chiuso]
Domanda
Sto leggendo il libro di testo intitolato "Introduzione al linguaggio assembly 80x86 e all'architettura del computer" di Richard C.Detmer e a pagina 59 si parla del BYTE direttiva in linguaggio assembly e utilizzandola per caratteri e stringhe.Ecco il testo:
"Oltre agli operandi numerici, il BYTE La direttiva consente operandi di carattere con un singolo carattere o operandi di stringa con molti caratteri.Per designare caratteri o delimitare stringhe è possibile utilizzare apostrofi (') o virgolette (").Devono essere in coppia;non è possibile inserire un apostrofo a sinistra e una virgoletta a destra.Una stringa delimitata da apostrofi può contenere virgolette, mentre una stringa delimitata da virgolette può contenere apostrofi, rendendo possibile avere stringhe contenenti questi caratteri speciali."
Questo è molto comprensibile, ma la mia curiosità è la BYTE direttiva perché pensavo che potesse contenere solo un singolo byte, otto bit.Ho fatto una prova e se ho detto
string BYTE "HelloWorld"
ovviamente verrebbe compilato, ma se controlli l'esadecimale noterai che non è solo un singolo byte ma più byte.Osservando una tabella ascii sappiamo già che un singolo carattere è un byte.Allora come possiamo avere delle stringhe?Ho provato ad applicarlo con i numeri.Conosciamo la gamma per il BYTE la direttiva va da -128 a 255.Ho provato questo codice:
number BYTE 9987
quando ho provato a compilare ed eseguire, ho ricevuto un errore perché ovviamente 9987 era più grande di un byte.Ma perché le stringhe ne sono immuni?Perché il BYTE la direttiva contiene più di un byte nei contesti delle stringhe ma non fa lo stesso con i numeri?
Immagino che quando ho compilato ed eseguito la prima istruzione di codice che ho elencato abbia lo stesso errore della seconda.Perché qui la "regola" è infranta?
-Dan
Soluzione
Si noti che non esiste una sintice sintassi dell assemblatore, diversi programmi possono utilizzare la sintassi diversa.Dovresti consultare il manuale del gruppo Assembler.
Detto questo, la costante stringa è solitamente solo una notazione stennato per ciascuno dei caratteri separatamente e la direttiva BYTE
consente di definire più elementi di essere definiti contemporaneamente.
Quindi, ad esempio, BYTE 1, 2, 3, 4
è valido e definisce 4 byte e il string BYTE "HelloWorld"
è equivalente a string BYTE 'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd'
e definisce 10 byte.La ragione per cui non si ottiene un errore è perché ogni personaggio su proprio si inserisce in un byte.
Alcuni assemblatori non consentono nemmeno gli scheduli di stringhe in BYTE
o direttive equivalenti, hanno direttive specializzate per le stringhe, ad esempio .string
o .ascii
.
Altri suggerimenti
IL BYTE
La direttiva dice all'assemblatore di riservare un blocco di memoria e di ricordarne la lunghezza in byte.La lunghezza è determinata dal numero di byte nell'inizializzatore, che potrebbe essere costituito da numeri compresi tra 0 e 255 decimali o da caratteri racchiusi tra virgolette singole.Le stringhe sono comuni nei linguaggi di programmazione e solitamente sono considerate matrici di caratteri in byte consecutivi in memoria.Per comodità del programmatore, l'assembler consente di riservare una sequenza di byte inizializzata in una stringa di caratteri specificando la stringa tra virgolette singole o doppie.Questi sono equivalenti
string1 BYTE 'H', 'e', 'l', 'l', 'o'
O
string1 BYTE 'Hello'
Alcuni assemblatori hanno direttive diverse a questo scopo, ad esempio Oracle Solaris x86 Assembly Language ha un file
.byte
direttiva che richiede solo byte.ascii
direttiva che accetta una stringa che non avrà terminazione NUL.string
direttiva che accetta una stringa whichwill
avere una terminazione NUL