Заполнение доп. сегмента ES (Nasm) - Assembler
Формулировка задачи:
Привет всем. Подскажите пожалуйста.
Нужно составить подпрограмму заполнения всего сегмента ES числами вроде 1,2,4,8...64,128, 1, 2, 4...(бегущая единица)
Ниже примерно набросал, как должно выглядеть...нужно ещё добавить проверку на макс. значение, и как то определить размер сегмента ES, цикл, буду благодарен если поможете разобраться. Заранее спасибо.
N13Func proc x db 1 ;присвоил х = 1 mov eax, x ; передал в eax значение x add eax, x ; добавил х + х N13Func endp
Решение задачи: «Заполнение доп. сегмента ES (Nasm)»
textual
Листинг программы
mov es,какое-то значение mov cx,65535 mov di,0; заполняем сегмент с 0 по 65535 байт mov al,1 a0: stosb; mov es:[di],al di:=di+1 rol al,1 loop a1
Объяснение кода листинга программы
- mov es,какое-то значение - Здесь ES (Extra Segment) присваивается определенное значение, которое будет использоваться в дальнейшем коде. Без этого значения невозможно корректно работать с сегментом.
- mov cx,65535 - CX (Counter) устанавливается в максимальное значение, которое может быть использовано в 16-битном режиме. Это значение будет использоваться для итерации по каждому байту в сегменте.
- mov di,0; заполняем сегмент с 0 по 65535 байт - DI (Data Indicator) устанавливается в 0, что определяет начальный адрес сегмента. Затем, используя цикл, каждый байт в диапазоне от 0 до 65535 будет заполнен значением AL (Accumulator).
- mov al,1 - AL (Accumulator) устанавливается в 1. Это значение будет использоваться для заполнения байтов в сегменте.
- a0: stosb; mov es:[di],al di:=di+1 - Здесь начинается цикл, который будет выполняться до тех пор, пока не будет достигнуто максимальное значение CX. Команда STOS (Store String) используется для записи значения AL в байт по адресу ES:[DI]. Затем DI увеличивается на 1, чтобы перейти к следующему байту.
- rol al,1 - Команда ROL (Rotate Left) используется для сдвига значения AL на 1 бит влево. Это необходимо для обеспечения корректной работы цикла.
- loop a1 - Здесь начинается цикл, который будет выполняться до тех пор, пока не будет достигнуто максимальное значение CX. Команда LOOP (Loop) используется для перехода к началу цикла и продолжения его выполнения до тех пор, пока не будет выполнено условие выхода из цикла.