Сборка Move File Pointer
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-битных значений.