Программа проходит компиляцию, но не запускается (TASM) - Assembler

Узнай цену своей работы

Формулировка задачи:

доброго времени суток. в адрессах 300h, 301h, 302h есть числа. программа должна их выровнять по убыванию.
Листинг программы
  1. code segment
  2. assume cs:code,ds:code
  3. start: mov ax,code
  4. mov ds,ax
  5. mov di,300h
  6. mov si,301h
  7. mov bx,302h
  8. cmp di,si
  9. ja good1
  10. mov di,301h
  11. mov si,300h
  12. good1:cmp si,bx
  13. ja good2
  14. mov si,302h
  15. mov bx,301h
  16. good2:cmp di,bx
  17. ja good3
  18. mov di,302h
  19. mov bx,300h
  20. good3:
  21. mov ah,4ch
  22. int 21h
  23. code ends
  24. end start

Решение задачи: «Программа проходит компиляцию, но не запускается (TASM)»

textual
Листинг программы
  1. ; FASM-code//
  2. ; Сортировка прямым выбором
  3. ;--------------------------------------------------------
  4. org 100h
  5.       mov   cx,3             ; длина массива
  6.       mov   di,300h          ; указатель на начало
  7.       mov   dx,di            ;
  8.       add   dx,cx            ; указатель на конец
  9. @0:   mov   bx,dx            ;
  10.       mov   al,byte[di]      ;
  11. @1:   dec   bx               ;
  12.       cmp   al,byte[bx]      ;
  13.       jae   @2               ; сортировка по убыванию
  14.       xchg  al,byte[bx]      ;
  15. @2:   cmp   bx,di            ; конец прохода?
  16.       jnz   @1               ;
  17.       stosb                  ; переставляем элементы!
  18.       loop  @0               ;
  19.  
  20.       mov   ah,1             ; пауза..
  21.       int   21h              ;
  22.       ret                    ; выход в DOS

Объяснение кода листинга программы

  1. org 100h - начало программы, указывает на то, что сегмент данных будет начинаться с 100h
  2. mov cx,3 - в переменную cx записывается значение 3. Это будет использоваться как длина массива.
  3. mov di,300h - в переменную di записывается значение 300h. Это будет использоваться как начальный адрес массива.
  4. mov dx,di - в переменную dx копируется значение переменной di, т.е. начальный адрес массива.
  5. add dx,cx - к значению переменной dx прибавляется значение переменной cx. Это будет использоваться как конечный адрес массива.
  6. mov bx,dx - в переменную bx копируется значение переменной dx, т.е. конечный адрес массива.
  7. mov al,byte[di] - в переменную al записывается байт, который находится по адресу, указанному в переменной di.
  8. dec bx - значение переменной bx уменьшается на 1.
  9. cmp al,byte[bx] - сравнивается значение переменной al и байт, который находится по адресу, указанному в переменной bx.
  10. Если значение переменной al больше или равно значению байта по адресу bx, то происходит переход к следующему элементу массива.
  11. Если значение переменной al меньше значения байта по адресу bx, то происходит обмен значениями между переменной al и байтом по адресу bx.
  12. cmp bx,di - сравниваются значения переменных bx и di. Если bx меньше di, значит, мы достигли конца массива.
  13. Если значение переменной bx меньше значения переменной di, то происходит переход к началу цикла.
  14. stosb - выполняется операция перестановки байтов.
  15. loop @0 - происходит переход к началу цикла.
  16. mov ah,1 - в переменную ah записывается значение 1. Это будет использоваться для паузы.
  17. int 21h - выполняется системный вызов, который отображает графический символ в консоли. В данном случае это символ точки.
  18. ret - выполняется возврат в DOS.

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


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

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

14   голосов , оценка 4.214 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы