Самое короткое слово - Assembler
Формулировка задачи:
Дано задание: ввести слова с клавиатуры через пробел, определить и вывести в консоль самое короткое слово.
Находил на этом же сайте код программы, но без комментариев не разобрался. Поэтому написал свой код, но почему то он не работает. Прошу вашей помощи.
data segment string db 100,100 dup ('$') min dw 0 data ends code segment assume cs:code,ds:data start: mov ax, data mov ds, ax mov ah,0ah lea dx,string int 21h xor cx,cx mov bl,offset string\\ заносим адрес первого элемента строки cikl: mov al,byte ptr [bl]\\адрес передаем в регистр, что бы можно было сравнивать далее с аски кодом клавиш cmp al,13h\\сравниваем с энтером(концом строки) je konec cmp al,20h\\(сравниваем с пробелом) je m1 inc cx\\если не обнаружено пробела или конца строки инкрементируем сх m1: cmp cx,min\\сравниваем наше слово с минимальным значением jg b1 mov min,cx\\если слово меньше минимального значения то заносим его в мин b1: inc bl\\ переходим к следующему элементу строки jmp cikl konec: mov string+1,0ah\\вывод на экран(взято с методички возможны ошибки с выводом в этом куске) mov ah,9 lea dx,string+1 int 21h mov ah, 10h int 16h mov ax, 4c00h int 21h code ends end start
Решение задачи: «Самое короткое слово»
textual
Листинг программы
stek segment stack 'stack' db 200h dup (?) stek ends data segment string db 100,?,100+1 dup ('$') min dw 32767 ;Максимальное положительное число data ends code segment assume cs:code,ds:data start: mov ax, data mov ds, ax mov ah,0ah lea dx,string int 21h xor dx,dx ; Флаг "окучиваем слово" = ложь, еще не окучиваем mov bx,offset string+2 ; заносим адрес первого элемента строки mov di,bx ; cikl: mov al,[bx] ;очередная буква строки cmp al,13 ;сравниваем с возвратом каретки je m1 ;если да, окучим длину последнего слова, потом выйдем cmp al,20h ;сравниваем с пробелом je m1 ;если да, старое слово кончилось, окучим его длину test dx, dx ;Мы уже окучиваем слово ? jnz l1 ;Если да, то увеличим его длину xor cx,cx ;Первый символ слова, его длину начинаем считать с нуля inc dx ; Флаг = правда, окучивать слово начали mov si,bx ; l1: inc cx ;инкрементируем длину слова jmp b1 m1: test dx,dx ;Мы уже окучиваем слово ? jz n1 ;Переход, если нет xor dx, dx ; Флаг = ложь, старое слово кончилось, новое не началось cmp cx,min ;сравниваем длину старого слова с минимальным значением jg n1 ;Более короткого не нашли mov min,cx ;если слово короче минимального значения то заносим его в мин mov di,si ; n1: cmp al,13 ;сравниваем с энтером(концом строки) je konec ;если слово было последнее, то заканчиваем b1: inc bx ; переходим к следующему элементу строки jmp cikl konec: mov string,0dh mov string+1,0ah mov dx,di mov ah,9 int 21h mov ah, 10h int 16h mov ax, 4c00h int 21h code ends end start
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д