#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
Я также добавлю, что в будущих вопросах по сборке вы всегда должны обсуждать рассматриваемую архитектуру — общих вопросов по сборке почти нет.