Самое короткое слово - 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.786 из 5
Похожие ответы