Консультация № 182537
17.03.2011, 06:16
0.00 руб.
17.03.2011, 17:53
0 8 1
Здравствуйте! У меня возникли сложности с таким вопросом: Помогите с программой на языке ассемблер под ОС Windows XP. Прокомментируйте программу. Я только начал изучать ассемблер, поэтому можете расписать как запустить программу на TASM.
Условие задачи: 9. Даны 5 чисел (положительных и отрицательных): х1, x2 …x5, найти среди них минимальное по абсолютной величине (А) и посчитать выражение А2 - x5.

Заранее Большое Спасибо!!!!!!!

Обсуждение

давно
Посетитель
7438
7205
17.03.2011, 14:47
общий
Адресаты:
Числа х1, x2, …, x5 задавать в программе или надо вводить с клавиатуры?
Вместо А2 может все-таки А? Т.е., найденное "минимальное по абсолютной величине"...
Или может требуется А * 2 - х5 ?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
276566
297
17.03.2011, 17:23
общий
Адресаты:
Здравствуйте! A^2-x5
давно
Посетитель
276566
297
17.03.2011, 17:24
общий
Адресаты:
Числа скорей всего вводить с клавиатуры.
давно
Посетитель
7438
7205
17.03.2011, 17:56
общий
Адресаты:
Величины - байты, слова, двойные слова?
Если без разницы, примем, что слова...
Также примем, что А2 будет в пределах слова...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
276566
297
18.03.2011, 09:12
общий
Адресаты:
Здравствуйте! По поводу величины байт,слово,двойное слово не уточняли, поэтому без разницы.
давно
Посетитель
7438
7205
18.03.2011, 11:02
общий
это ответ
Здравствуйте, Magma!

Считаем, что наши слова хранятся в словах. Также считаем, что А2 будет в пределах слова...

Программа рассчитана на формат COM, поэтому ассемблируем и линкируем следующим образом:
Код:
tasm name
tlink /t name


[code h=200];Даны 5 чисел (положительных и отрицательных): х1, x2 …x5,
;найти среди них минимальное по абсолютной величине (А) и посчитать выражение А^2 - x5

N equ 5

.model tiny
.data
x dw N dup (?)
;сообщения программы
sNumber db 0dh,0ah,'Enter X[$' ;потом добавим индекс
sTail db ']: $' ;выведем после индекса
sA db 0dh,0ah,'A = $'
sA2mX5 db 0dh,0ah,'A^2 - X[5] = $'
sPress db 0dh,0ah,'Press any key$'




COUNT equ 5 ;количество чисел

model tiny ;модель памяти (для программы в формате COM)
.code
org 100h ;начало программного сегмента (для программы в формате COM)
start: mov cx, COUNT ;счетчик чисел
lea di, x ;адрес массива Х, сюда будем сохранять введенные числа
mov si, 07fffh ;A - минимальное значение модуля числа
;(пока равно заведомо самому большому положительному значению)

Continue: ;цикл ввода и поиска минимального по модулю числа
call InputNum ;вводим число
stosw ;сохраняем в массиве Х
test ax, ax ;найдем модуль числа
jge CmpMin ;если >=0, то так и остается
neg ax ;если отрицательное, то делаем положительным
CmpMin:
cmp ax, si ;сравним с минимальным
jae Next ;если больше или равно, то обходим
mov si, ax ;новое минимальный модуль числа
Next: ;на следующее число
loop Continue ;цикл

lea dx, sA ;строка 'A ='
mov ah, 9
int 21h
mov ax, si ;минимальное по абсолютной величине число А
call PrintNum ;выведем

lea dx, sA2mX5 ;'A^2 - X[5] = '
mov ah, 9
int 21h
;посчитаем
mov ax, si ;А
mul ax ;A^2
sub ax, [x+8] ;A^2 - X[5] (элементы хранятся в массиве по индексам 0, 2, 4, 6, 8)
call PrintNum ;выведем

lea dx, sPress ;'Press any key'
mov ah, 9
int 21h

mov ah, 8 ;подождем нажатия на клавишу (чтобы консоль осталась на экране)
int 21h

mov ax, 4c00h ;выход в ДОС
int 21h

;
;подпрограмма чтения знакового числа
InputNum proc
push cx ;сохраним счетчик чисел
lea dx, sNumber ;сообщение 'Enter X['
mov ah,9
int 21h
mov dl, N+31h ;преобразуем счетчик N, N-1, N-2, N-3, N-4 в цифры '1', '2', '3', '4', '5'
sub dl, cl ;например, для cl=N-1 имеем dl=N+31h-(N-1)=32h='2'
mov ah, 2
int 21h
lea dx, sTail ;закончим строкой ']: '
mov ah, 9
int 21h

xor bx, bx ;здесь будем накапливать число
mov cx, 10 ;будем умножать на 10
xor bp, bp ;знак числа, =0 - положительное, =1 - отрицательное
SymLoop:
mov ah, 8 ;чтение символа без эхо
int 21h
cmp al, 0dh ;клавиша Enter
jz NumEntered ;конец ввода
cmp al, '-'
jne CmpDigits ;не минус - на проверку на цифру
test bp, bp ;проверим, был ли уже введен минус
jnz SymLoop ;повторный минус запрещен!
inc bp ;помечаем отрицательное число
mov dl, al ;выведем минус
mov ah, 2
int 21h
jmp SymLoop ;на повтор
CmpDigits:
cmp al,'0' ;проверим на цифру
jb Symloop ;нецифры игнорируем
cmp al,'9'
ja Symloop
;умножим введенное число на 10 и добавим только что введенный разряд
xchg ax, bx ;ax = старшим разрядам, bl = введенной цифре
mul cx ;dx:ax = старшим разрядам * 10
mov dl, bl ;dl = введенной цифре (для вывода)
and bx, 0fh ;bx = 0-9 = введенному младшему разряду
add bx, ax ;bx = введенному числу (на данный момент)

mov ah, 2 ;выведем на экран введенную младшую цифру
int 21h
jmp SymLoop ;повторяем до Enter-a
NumEntered:
mov ax, bx ;введенное число возвращаем в ax
test bp, bp ;учтем знак
jz InputRet
neg ax ;для отрицательного числа
InputRet:
pop cx ;восстановим счетчик вводимых чисел
ret
InputNum endp

PrintNum proc ;вывод знакового числа в виде последовательности цифр
test ax, ax ;проверим на знак
jge PrintPositive
push ax ;выведем знак минуса
mov dl, '-'
mov ah, 2
int 21h
pop ax
neg ax ;сделаем положительным
PrintPositive:
mov bx, 10 ;будем делить на 10
xor cx, cx ;счетчик цифр
div_loop: ;цикл получения десятичных разрядов
xor dx, dx ;подготовимся для очередного деления
div bx ;в dx остаток - очередной десятичный разряд
push dx ;сохраним в стеке (от младшего к старшему)
inc cx ;посчитаем
test ax, ax ;есть еще десятичные разряды?
jnz div_loop ;продолжим

pr_loop: ;цикл вывода десятичных цифр-символов
pop dx ;востановим очередной разряд (от старшего к младшему)
add dl, '0' ;символ цифры
mov ah, 2 ;выведем
int 21h ;
loop pr_loop ;по всем цифрам
ret
PrintNum endp

end start ;точка входа[/code]

Примерный вывод программы:
Код:
Enter X[1]: 1
Enter X[2]: 234
Enter X[3]: 0
Enter X[4]: -34
Enter X[5]: -12
A = 0
A^2 - X[5] = 12
Press any key
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
276566
297
18.03.2011, 11:37
общий
Адресаты:
В CMD после ввода C:\>tasm \zi name.asm. Он выдает ошибку что tasm не является внутренней или внешней командой, исполняемой программой или пакетным файлом. Скажите как правильно запустить программу чтобы он работала.
давно
Посетитель
7438
7205
18.03.2011, 17:29
общий
Адресаты:
В какой папке лежит tasm?
Вы же хотите его запустить из корня, там явно его нет...
Сначала перейдите в папку с tasm-ом, скопируйте туда исходник и запускайте...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа