Программа проходит компиляцию, но не запускается (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
Объяснение кода листинга программы
- org 100h - начало программы, указывает на то, что сегмент данных будет начинаться с 100h
- mov cx,3 - в переменную cx записывается значение 3. Это будет использоваться как длина массива.
- mov di,300h - в переменную di записывается значение 300h. Это будет использоваться как начальный адрес массива.
- mov dx,di - в переменную dx копируется значение переменной di, т.е. начальный адрес массива.
- add dx,cx - к значению переменной dx прибавляется значение переменной cx. Это будет использоваться как конечный адрес массива.
- mov bx,dx - в переменную bx копируется значение переменной dx, т.е. конечный адрес массива.
- mov al,byte[di] - в переменную al записывается байт, который находится по адресу, указанному в переменной di.
- dec bx - значение переменной bx уменьшается на 1.
- cmp al,byte[bx] - сравнивается значение переменной al и байт, который находится по адресу, указанному в переменной bx.
- Если значение переменной al больше или равно значению байта по адресу bx, то происходит переход к следующему элементу массива.
- Если значение переменной al меньше значения байта по адресу bx, то происходит обмен значениями между переменной al и байтом по адресу bx.
- cmp bx,di - сравниваются значения переменных bx и di. Если bx меньше di, значит, мы достигли конца массива.
- Если значение переменной bx меньше значения переменной di, то происходит переход к началу цикла.
- stosb - выполняется операция перестановки байтов.
- loop @0 - происходит переход к началу цикла.
- mov ah,1 - в переменную ah записывается значение 1. Это будет использоваться для паузы.
- int 21h - выполняется системный вызов, который отображает графический символ в консоли. В данном случае это символ точки.
- ret - выполняется возврат в DOS.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д