Вывод строки по буквам (FASM) - Assembler
Формулировка задачи:
Доброго времени суток, господа программисты!
Задача такова: нужно вывести на экран строку, допустим Hello World, посимвольно, и, чтобы каждый символ перебирал все буквы, прежде, чем остановиться на той, которая нужна. Надеюсь, всё понятно
Буду благодарна, если поможете)
Решение задачи: «Вывод строки по буквам (FASM)»
textual
Листинг программы
org 100h jmp @@00 dbStr db 'qwertyuiopasdfghjkl' @@00: mov ax,3 int 10h mov ax,0B800h mov es,ax mov cx,19 mov si,dbStr mov ah,0Fh xor di,di @@01: lodsb push cx mov bl,'a'-1 xchg al,bl @@02: inc al stosw ; sub di,2;для проверки работы кода mov cx,-1 @@03: loop @@03 cmp bl,al jnz @@02 pop cx stosw mov al,' ';вывод разделителя, для проверки работы кода stosw; loop @@01 xor ax,ax int 16h ret
Объяснение кода листинга программы
- org 100h — начало выполнения программы, адрес 100h используется как точка отсчёта
- jmp @@00 — переход к метке @@00
- dbStr db 'qwertyuiopasdfghjkl' — определение строки dbStr, которая содержит последовательность 'qwertyuiopasdfghjkl'
- mov ax,3 — значение переменной ax устанавливается равным 3
- int 10h — вывод значения переменной ax на экран (в данном случае это 3)
- mov ax,0B800h — значение переменной ax устанавливается равным 0B800h (используется для работы с сегментом памяти)
- mov es,ax — значение переменной es устанавливается равным значению переменной ax (0B800h)
- mov cx,19 — значение переменной cx устанавливается равным 19
- mov si,dbStr — значение переменной si устанавливается равным значению переменной dbStr (начальный адрес строки 'qwertyuiopasdfghjkl')
- mov ah,0Fh — значение переменной ah устанавливается равным 0Fh (используется для работы с регистром AL)
- xor di,di — значение регистра di устанавливается равным 0 (используется в цикле)
- @@00: lodsb — загрузка байта из памяти по адресу, на который указывает смежная переменная si, в регистр AL
- push cx — значение переменной cx сохраняется на стеке
- mov bl,'a'-1 — значение переменной bl устанавливается равным 'a'-1 (используется для сравнения с регистром AL в цикле)
- xchg al,bl — обмен значений между регистрами AL и BL
- inc al — увеличение значения регистра AL на 1
- stosw — вывод значения регистра AL в память по адресу, на который указывает смежная переменная es, с последующим инкрементом (переменная es увеличивается на 2)
- sub di,2 — уменьшение значения регистра di на 2 (используется для проверки работы кода)
- loop @@03 — переход к метке @@03 при условии, что значение регистра di больше или равно 2 (то есть до завершения цикла)
- cmp bl,al — сравнение значений регистров BL и AL (в данном случае они должны быть равны после инкремента в предыдущем цикле)
- jnz @@02 — переход к метке @@02 при условии, что регистры BL и AL не равны (то есть до завершения цикла)
- pop cx — восстановление значения переменной cx из стека
- stosw — вывод значения переменной cx в память по адресу, на который указывает смежная переменная es, с последующим инкрементом (переменная es увеличивается на 2)
- mov al,' '; — вывод разделителя ' ' (регистр AL устанавливается равным ' ')
- stosw — вывод значения регистра AL в память по адресу, на который указывает смежная переменная es, с последующим инкрементом (переменная es увеличивается на 2)
- loop @@01 — переход к метке @@01 до тех пор, пока значение регистра cx не станет меньше или равным 0 (то есть до завершения цикла)
- xor ax,ax — обнуление значения регистра ax (используется для завершения работы программы)
- int 16h — завершение работы программы (возврат управления операционной системе)
- ret — конец программы (возврат управления на уровень, предшествующий вызовому данной программы)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д