Хранение меча в адрес

Я изучаю некоторые части ассемблера, и сейчас я сосредоточен на хранении объявлений данных в адресах.

Когда дело доходит до хранения hex, я знаю, что если я имею дело, например, с байтами;

1234

Я могу хранить их так:

Address 0000  -  12  
Address 0001  -  24

Поскольку слова состоят из 32 битов, я предполагаю, что каждое из них будет занимать вдвое больше места.

Если я в конечном итоге это за меч:

54 00 87 D1 49 5A AF 56 32

Будут ли они храниться так:

Address 0000  -  54  
Address 0002  -  00
Address 0004  -  87
Address 0006  -  D1
Address 0008  -  49
Address 000A  -  5A
Address 000C  -  AF
Address 000F  -  56
Address 0011  -  32

?

1 ответ

Как уже указывалось, ваши ценности превышают меч.

На x86 "слово" составляет 16 бит, потому что 8086 - это 16-битный микропроцессор. В этом контексте это означает "два байта". "Двойное слово" - это два слова или четыре байта, а "четверное слово" - это четыре слова или восемь байтов. x86 - это процессор с прямым порядком байтов, поэтому он начинает запись в память с самого конца вашего регистра.

Если вы делаете что-то вроде (в синтаксисе intel и шестнадцатеричных числах в стиле gcc):

#Load the lowest 8 bits of the rax register (al) with 0x54
#This is loading a BYTE (1 byte)
mov   al,0x54
#Load the lowest 16 bits of the rbx register (bx) with 0x5400
#This is loading a WORD (2 bytes)
mov   bx,0x5400
#Load the lowest 32 bits of the rcx register (ecx) with 0x540087D1
#This is loading a DWORD (4 bytes)
mov   ecx,0x540087D1
#Load the entire 64 bit register rdx with 0x540087D1495AAF56
#This is loading a QWORD (8 bytes)
mov   rdx,0x540087D1495AAF56

Затем, если бы вы переместили их по адресу, указанному в регистре RSI, вы получите:

#Put the value of al (0x54) into address at [rsi+0]
mov   [rsi],al
#Put the value of bx (0x5400) starting at the address at rsi+0, 
# such that [rsi+0] will be 0x00 and [rsi+1] will be 0x54
mov   [rsi],bx
#Put the value of ecx (0x540087D1) starting at the address of rsi+0,
# such that [rsi+0] will be 0xD1, [rsi+1] will be 0x87, 
# [rsi+3] will be 0x00, and [rsi+4] will be 0x54
mov   [rsi],ecx
#Put the value of rdx (0x540087D1495AAF56) starting at the address of rsi+0,
#such that [rsi++0] will be 0x56, [rsi+1] will be 0xAF, 
# [rsi+2] will be 0x5A, [rsi+3] will be 0x49, 
# [rsi+4] will be 0xD1, [rsi+5] will be 0x87,
# [rsi+6] will be 0x00, and [rsi+7] will be 0x54
mov   [rsi],rdx  

Ваше примерное значение с 9 байтами не вписывается ни в один из регистров и не относится к типу машины.

Таким образом, ваш результирующий баран для двойного слова будет выглядеть так

0x540087D1 (с прямым порядком байтов, например x86):
Первый адрес - 0xD1
Второй адрес - 0x87
Третий адрес - 0x00
Четвертый адрес - 0x54

(big endian, такой как SPARC):
Первый адрес - 0x54
Второй адрес - 0x00
Третий адрес - 0x87
Четвертый адрес - 0xD1

Я также добавлю, что в будущих вопросах сборки вы всегда должны обсуждать обсуждаемую архитектуру - почти нет общих вопросов сборки.

Другие вопросы по тегам