Нумерация списка - Assembler
Формулировка задачи:
Здравствуйте, написал вот такую программу, которая выводит количество и список разделов, мне нужно сделать нумерацию списка по порядку, но у меня не получается это сделать как видно на скриншоте, подскажите как исправить ошибку
.386 dseg segment use16 buffer db 446 dup (0) part1 db 16 dup(0) part2 db 16 dup(0) part3 db 16 dup(0) part4 db 16 dup(0) sign db 02 dup(0) errr db 'Attention sector read error! $' razdel db 13,10,'Kolichestvo razdelov: $' mes db 13,10,'Pazdel(1): $' ;Пакет дискового адреса paket db 16 ;длинна пакета db 0 db 1 ;кол-во секторов для чтения db 0 dw buffer ;внутрисегментная адресация области буфера dw dseg ;значение указателя сегмента данных dq 0 ;номер сектора в LBA rest db 'Razshireniy.razdel $' txtntfs db 'NTFS $' txtfat16 db 'FAT16 $' txtfat32 db 'FAT32 $' dseg ends cseg segment use16 assume ds:dseg, cs:cseg m1: mov cx, dseg mov ds, cx mov ah,42h mov dl,80h ;номер устройства lea si,paket ;смещение пакета диского адреса в сегмент данных int 13h jc short eerr mov ah,9 lea dx,razdel int 21h lea si,part1+4 mov cx,4 mov al,'0' find: cmp byte ptr [si],0 ; проверка очередного флага jz next inc al ; счётчик, если не нуль next: add si,16 ; адрес сл.флага.. loop find int 29h ; показываем типы найденных разделов n1: lea si,buffer ; add si,01c2h ; mov cx,4 mov dl,0h srav: cmp cx,0 jz exit ;выход из проверки mov bl,ds:[si] cmp bl,07h ;ntfs jz ntfs c1: cmp bl,06h ;fat16 jz fat16 c2: cmp bl,0bh ;FAT32 jz fat32 c3: cmp bl,0fh ;расширенный раздел jz rashraz cmp bl,05h jz rashraz c4: mov ah, 9 ;вывод списка разделов lea dx,mes int 21h dec cx add si,16 jmp srav ;завершение исполнения exit: mov ah,4ch int 21h eerr: mov ah,9 lea dx,errr int 21h jmp short exit ;вывод сообщений о найденных типах разделов ntfs: mov ah,9 lea dx,txtntfs int 21h jmp c1 fat16: mov ah,9 lea dx,txtfat16 int 21h jmp c2 fat32: mov ah,9 lea dx,txtfat32 int 21h jmp c3 rashraz: mov ah,9 lea dx,rest int 21h jmp c4 cseg ends end m1
Решение задачи: «Нумерация списка»
textual
Листинг программы
mov ah, 9 ;вывод списка разделов lea dx,mes int 21h inc byte[mes+9]
Объяснение кода листинга программы
- mov ah, 9 — в данном случае переменная
ah
используется как регистр для хранения номера сегмента, который необходим для обращения к памяти. Значение 9, переданное в регистрah
, определяет функцию, которую мы хотим выполнить — в данном случае это вывод списка разделов. - lea dx, mes — здесь переменная
dx
используется как регистр для хранения номера сегмента, аmes
— это адрес памяти, где хранится строка, которую мы хотим вывести. lea означаетперенести адрес
. - int 21h — это команда для вызова функции BIOS, которая занимается выводом на экран.
- inc byte[mes+9] — это команда для увеличения значения в памяти по адресу
mes+9
на единицу.byte
означает, что мы обращаемся к памяти как к массиву байтов, аinc
означаетувеличить на единицу
.