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

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

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

доброго времени суток. в адрессах 300h, 301h, 302h есть числа. программа должна их выровнять по убыванию.
code segment
assume cs:code,ds:code
start: mov ax,code
       mov ds,ax
 
        mov di,300h
        mov si,301h
        mov bx,302h
        cmp di,si
        ja good1
        mov di,301h
        mov si,300h
        good1:cmp si,bx
        ja good2
        mov si,302h
        mov bx,301h
        good2:cmp di,bx
        ja good3
        mov di,302h
        mov bx,300h
        good3:
 
       mov ah,4ch
       int 21h
code ends
end start

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

textual
Листинг программы
; FASM-code//
; Сортировка прямым выбором
;--------------------------------------------------------
org 100h
      mov   cx,3             ; длина массива
      mov   di,300h          ; указатель на начало
      mov   dx,di            ;
      add   dx,cx            ; указатель на конец
@0:   mov   bx,dx            ;
      mov   al,byte[di]      ;
@1:   dec   bx               ;
      cmp   al,byte[bx]      ;
      jae   @2               ; сортировка по убыванию
      xchg  al,byte[bx]      ;
@2:   cmp   bx,di            ; конец прохода?
      jnz   @1               ;
      stosb                  ; переставляем элементы!
      loop  @0               ;
 
      mov   ah,1             ; пауза..
      int   21h              ;
      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
Похожие ответы