Вопрос № 182537: Здравствуйте! У меня возникли сложности с таким вопросом: Помогите с программой на языке ассемблер под ОС Windows XP. Прокомментируйте программу. Я только начал изучать ассемблер, поэтому можете расписать как запустить программу на TASM. Условие ...
Вопрос № 182538: Здравствуйте! Прошу помощи в следующем вопросе:Помогите с программой на ассемблере под ОС Windows XP, для TASM.Программу прокомментировать. Условие задачи:14. Дана двухбайтовая двоичная строка. Сформировать строку, в которой после каждого байта н...
Вопрос № 182537:
Здравствуйте! У меня возникли сложности с таким вопросом: Помогите с программой на языке ассемблер под ОС Windows XP. Прокомментируйте программу. Я только начал изучать ассемблер, поэтому можете расписать как запустить программу на TASM. Условие задачи: 9. Даны 5 чисел (положительных и отрицательных): х1, x2 …x5, найти среди них минимальное по абсолютной величине (А) и посчитать выражение А2 - x5.
Заранее Большое Спасибо!!!!!!!
Отправлен: 17.03.2011, 06:16
Вопрос задал: Magma (Посетитель)
Всего ответов: 1 Страница вопроса »
Считаем, что наши слова хранятся в словах. Также считаем, что А2 будет в пределах слова...
Программа рассчитана на формат COM, поэтому ассемблируем и линкируем следующим образом:
Код:
tasm
name tlink /t name
Код:
;Даны 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 ;точка входа
Примерный вывод программы:
Код:
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
----- Люби своего ближнего, как самого себя
Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 18.03.2011, 11:02
Номер ответа: 266301 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 266301
на номер 1151 (Россия) |
Еще номера »
Вопрос № 182538:
Здравствуйте! Прошу помощи в следующем вопросе:Помогите с программой на ассемблере под ОС Windows XP, для TASM.Программу прокомментировать. Условие задачи:14. Дана двухбайтовая двоичная строка. Сформировать строку, в которой после каждого байта находится бит четности этого байта.
Заранее Спасибо!!!!
Отправлен: 17.03.2011, 06:16
Вопрос задал: Magma (Посетитель)
Всего ответов: 1 Страница вопроса »
Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Magma! Вот и программа. Смотрите комментарии в теле программы... Надеюсь, разберетесь самостоятельно. Если нет, милости просим в мини-форум
Код:
.model tiny ;для формата COM .code org 100h ;для формата COM start: ;точка входа mov ax, 0101011110001100b ;наша двухбайтовая двоичная строка call FormParityString;выведем
lea dx, sPress ;'Press any key' mov ah, 9 int 21h
mov ah, 8 ;подождем нажатия на клавишу (чтобы консоль осталась на экране) int 21h
mov ax, 4c00h ;выход в ДОС int 21h
;подпрограмма вывода слова п
обайтно в виде последовательности бит с битом четности ;выводятся биты в порядке мл бит первым, байты аналогично - мл байт первым ;бит четности для наглядности отделен пробелом и выводится после байта FormParityString proc push ax ;сохраним старший байт call PrintByteWithParity ;выведем младший байт pop ax ;восстановим mov al, ah ;выведем старший байт PrintByteWithParity: ;выведем байт из al push ax ;соохраним для анализа четности
mov ah, 2 ;функция вывода символа
из dl на экран mov cx, 8 ;всего 8 бит PrintByteBinLoop: shr al, 1 ;C = мл биту mov dl, '0' ;формируем код '0' или '1' adc dl, 0 ;сложим с битом переноса = очередному биту push ax ;сохраним байт с остальными битами int 21h ;выведем pop ax ;восстановим loop PrintByteBinLoop;по всем битам
mov dl, ' ' ;отделим пробелом int 21h
pop ax ;наш байт test ax, ax ;проверим на четно
сть mov dl, '0' ;формируем код '0' или '1' jp PrintParity ;флаг PF отвечает за четность, PF = 1 означает четное число единиц inc dl ;для нечетного выводим '1' PrintParity: mov ah, 2 ;выводим int 21h mov dl, ' ' ;отделим пробело int 21h ret FormParityString endp
.data sPress db 0dh,0ah,'Press any key$'
end start
Вывод программы:
Код:
00110001 1 11101010 1 Press any key
----- Люби своего ближнего, как самого себя
Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 18.03.2011, 11:36
Номер ответа: 266302 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 266302
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.