Сохранение dword в адрес

#assembly #hex #endianness #dword

#сборка #шестнадцатеричное #порядковый номер #dword

Вопрос:

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

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

 1234
  

Я могу хранить их следующим образом:

 Address 0000  -  12  
Address 0001  -  24
  

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

Если я получу это для dword:

 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. Почему в примере DWORD 9 байт? В любом случае, о чем ваш вопрос, порядковый номер ?

2. @MargaretBloom я собирался попробовать заполнить остальные 0 (если это не правильно). И да, если я использую little-endian, является ли процедура такой же, даже если она 32 бита? Этот сайт подразумевает, что это так, и, похоже, говорится, что независимо от того, с чем я имею дело, шаги одинаковы. Я думаю, я ищу проверку.

3. С помощью little-endian при сохранении многобайтового значения (word, dword и т. Д.) эмпирическим правилом является «младший байт по младшему адресу», где «младший байт» означает наименее значимый байт. Я смущен вашим вопросом, потому что в первом примере СЛОВО 1234h хранится в BE, а во втором примере хранятся байты, которые не имеют порядкового номера.

4. @MargaretBloom Ну, это действительно DWORD 540087D1495AAF5632h. Не уверен, что это что-то меняет.

5. Но 540087D1495AAF5632h это не DWORD, DWORD равен 4 байтам. В шестнадцатеричном форматировании вы можете легко подсчитывать длину значения в байтах, каждая пара цифр равна одному байту, поэтому ваше значение в байтах 54_00_87_D1_49_5A_AF_56_32 = 9 байт. (это 2 DWORD 1 БАЙТ).

Ответ №1:

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

На 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

(с большим порядковым номером, например, SPARC):
первый адрес — 0x54
Второй адрес — 0x00
Третий адрес — 0x87
Четвертый адрес — 0xD1

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