2016-03-14 9 views
-1

Я новичок в ASM. У меня вопрос о том, как данные сохраняются в памяти.Как данные сохраняются в памяти DOS 16 бит ASM?

Вот мой ASM 16 битный код

;db.com 
.model small 
.code 
org 100h 
start: 
jmp proses 
A db '123' 
B dw 0abcdh 
proses: 

int 20h 
end start 

Затем я пытаюсь отлаживать с -d командой

enter image description here

На рисунке выше показано, что A переменная в правильном порядке в стоимости гекса, но B переменная в CD затем AB.

Мой вопрос в том, почему данные в переменной A сохраняются по-разному с помощью переменной B переменная, пожалуйста, объясните мне?

+1

Вы наблюдаете за тем, что происходит, потому что x86 - это небольшая система. 'A db '123'' просто хранит 3 байта в строке. Когда вы перемещаетесь за пределы элементов данных размером более одного байта, байты хранятся в обратном порядке. 'B dw 0abcdh' - это 16-битное значение, поэтому байты слова сохраняются в памяти в обратном порядке, поэтому в памяти он отображается как' cd ab'. Если у вас есть 'C dd 11223344h', байты будут храниться в обратном порядке как' 44 33 22 11' –

+0

См. [Endianness] (https://en.wikipedia.org/wiki/Endianness) в википедии. – Ruslan

+1

Случай последовательности команд немного сложнее. Он начинается с кода операции инструкции, и если есть 16-разрядный операнд, это будет в порядке малозначности, то есть младший старший байт. Последовательности команд всегда начинаются с кода операции (независимо от его соответствия), иначе процессор не будет знать, сколько байтов содержит инструкцию. –

ответ

1

x86 использует Little Endian, так что слово будет храниться в виде низкого байта, старший байт и DWORD, как низким словом, высокое слово

0x1020 будет 0x20 0x10 в память
и 0xabcd1234 будет 0x34 0x12 0xcd 0xab

определяя db <string> Заказав ассемблер использовать ул в качестве последовательности байтов, и каждый байт сохраняется в том же порядке, один за другим

так, например,
db '",13,0 будет 0x30 0x31 0x32 0x33 0x34 0x35 0x0D 0x00

+0

Я исправил ошибку в вашем ответе. Вы ошибочно написали __quad__, который не совпадает с __dword__! – Fifoernik