Программа проходит компиляцию, но не запускается (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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д