Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2652
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2356
∙ повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1341
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1429
Дата выхода:22.03.2011, 07:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:217 / 67
Вопросов / ответов:2 / 2

Вопрос № 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
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Magma!

Считаем, что наши слова хранятся в словах. Также считаем, что А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 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 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 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное