Начнем с последних вопросов:
Когда Вы пишете
x dd 1234h в памяти это число хранится как
db 34h,12h,00h,00h именно поэтому у Вас там CS=0000.
Первым в памяти расположен IP, вторым CS. Это из-за команд RETN и RETF в обоих случаях извлекается IP и только в последней(дальний возврат) ещё извлекается CS, механизм изменения этих регитров ( CS:IP ) он одинаков для всех колманд переходов, вызова п/п и возврата из них.
Деректива
dword ptr указывает компилятору, что нужно сгенерировать команду которая читает двойное слово по адресу Х,
если после строки
x dw 1234h Вы поставите
x dw 0000h у Вас будет такойже результат как выше.
В ассемблере нет такого понятия как переменная или тип данных. Любая переменная в ассемблере описыватся адресом(сегмент:смещение) и количеством байт, а процессору без разницы, что там код или данные, а может ещё что-то, он просто выполняет команды. Директивы DB,DW,DD,DF,DQ,DT определяют количество байт которые должен зарезервировать компилятор. И если указано значение, то записать его туда.
К примеру:
db 9ah
dw 2034h;'4 '
dw 0000h
так в памяти выглядит команда CALL 0000:2034 , а могли быть и данные.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.