Сборка Move File Pointer

Как рассчитать значение CX:DX? Я не знаю, что это значит, кто-то поможет мне

1 ответ

Указатель файла - это адрес в содержимом файла. Если у вас есть растровое изображение, и вы знаете, что в коде данные пикселей начинаются со смещения 540, и вы хотите пропустить чтение заголовка, вы открываете файл, а затем устанавливаете указатель файла на смещение 540, а затем читаете пиксель. данные...

16 битов могут содержать 216 = 65536 различных комбинаций битов, установленных на 0 или 1.

Таким образом, общий способ интерпретации 16 битов как целых значений без знака состоит в обработке i-го бита как i-й степени двух значений, то есть "b0" имеет значение 20 = 1, "b10" имеет значение 210 = 1024 и т. Д.... При такой интерпретации 16-битное значение может охватывать все целые числа без знака от 0 до 65535.

Теперь, если у вас есть какой-то большой файл, например, 1 МБ... ну, это был большой файл в 1980 году, действительно, его не видели регулярно, конечно, сегодня это другой путь, у вас, вероятно, будут небольшие проблемы, чтобы найти файл с размер до 65536... 1 МБ не умещается в 16 бит. Поэтому, если вы хотите "скользить" указатель файла по его содержимому, вам нужно больше битов, чтобы указать, куда вы хотите указывать указатель файла.

Объединение двух 16-битных регистров дает 32-битные значения, которые могут иметь 232 = 4294967296 = 4Gi различных состояний. Теперь это будет охватывать файлы размером до 4 ГБ, что было больше, чем весь размер жесткого диска (80 МБ диски были распространены). Так что, если вы примерно в 198 раз проектируете файловую систему с запоминающими устройствами на десятки мегабайт и файлами в килобайтах, то наличие 32-битного указателя на файл звучит как перспективный дизайн, по крайней мере, на полвека.

И это все. cx:dx в этом контексте одно 32-битное значение, cx содержит верхние 16 бит, то есть от "b16" до "b31", dx удерживайте младшие 16 битов от "b0" до "b15". Чтобы восстановить значение в десятичном виде, вы можете сделать cx * 65536 + dx (*65536, потому что это число всех возможных значений в dxпосле того, как это исчерпано во время увеличения, вы увеличиваете cx один, и снова пройти через весь dx для следующих 65536 значений).

В двоичном коде вам не нужно ничего умножать, просто используйте это как старшие / младшие биты большого значения, то есть, чтобы добавить два смещения ax:bx + cx:dx Вы можете использовать такой код:

add dx,bx   ; adding low 16bit parts
            ; (will set carry flag in case of overflow)
adc cx,ax   ; adding high 16bit parts + CF
; here cx:dx is equal to the 32b addition result

Примечание: не путайте это 32-битное значение с 16-битной адресацией в реальном режиме, состоящей из segment:offsetв то время как для описания адреса физической памяти тоже используются два 16-битных значения, они комбинируются особым образом phys_adr = segment * 16 + offset чтобы охватить только 20-битное адресное пространство (1 МБ памяти выглядело как безумно большим, хотите верьте, хотите нет:)), но с разными перекрывающимися возможностями. Так, когда сегмент регистрируется как es, ds, cs, ss, ... Как правило, речь идет о вычислении адреса памяти, а не о полных 32-битных значениях, составленных из двух 16-битных значений.

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