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

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


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

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

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

Boriss
Статус: Академик
Рейтинг: 2669
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 2519
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2210
∙ повысить рейтинг »

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

Номер выпуска:1465
Дата выхода:21.06.2011, 13:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:208 / 64
Вопросов / ответов:4 / 4

Вопрос № 183642: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Задан массив из 6 чисел. Найти все числа которые заканчиваются на цифру 7 и поместить их в отдельный массив. Исходные числа положительные и заданы в байтовом формате, массив задаётся одним адресом....


Вопрос № 183640: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Дана целочисленная матрица в байтовом формате по строкам. Все операции обработки матрицы реализовать только циклами. При необходимости использовать макросы. Размерность 4х4. Найти общую сумму элемен...
Вопрос № 183641: Здравствуйте! Прошу помощи в следующем вопросе: Дана двухбайтовая двоичная строка. Проинвертировать первый полубайт строки, сложить по модулю 2 со вторым полубайтом и записать на место четвертого полубайта.Прошу как можно подробнее расписать коммента...
Вопрос № 183639: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Ввести произвольную символьную строку. Выделить из нее (с удалением из исходной строки) все цифры, сделать из них отдельную строку и записать их в файл....

Вопрос № 183642:

Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Задан массив из 6 чисел. Найти все числа которые заканчиваются на цифру 7 и поместить их в отдельный массив. Исходные числа положительные и заданы в байтовом формате, массив задаётся одним адресом. Прошу как можно подробнее расписать комментарии к программе. Заранее благодарен.

Отправлен: 16.06.2011, 12:26
Вопрос задал: Посетитель - 377712 (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Посетитель - 377712!
Числа ищем делением на 10 и проверкой остатка, равно ли 7-ми.
Программа записывает все такие числа в отдельный массив и считает их количество.
Массив задан в программе. Результат смотрим в отладчике.

Код :
;Задан массив из 6 чисел. 
;Найти все числа которые заканчиваются на цифру 7 и поместить их в отдельный массив. 
;Исходные числа положительные и заданы в байтовом формате, массив задаётся одним адресом.

 .model small

 .stack 100h

 .data
array db 66, 17, 23, 207, 7, 55 ;массив чисел
N equ $-array   ;длина массива (=6)
array7 db N dup (?)  ;сюда запишем найденные числа

 .code

main proc
 mov ax, @DATA ;настроим сегментные регистры
 mov ds, ax  ;на сегмент данных
 mov es, ax

 lea si, array ;исходный массив
 lea di, array7 ;сюда будем писать числа, которые заканчиваются на 7
 mov cx, N  ;количество исходных чисел
 mov bl, 10  ;будем делить на 10 и смотреть остаток
 xor dx, dx  ;счетчик чисел, которые заканчиваются на 7
mainLoop:   ;по всем
 lodsb   ;очередное число, si=si+1
 mov ah, 0  ;сделаем из байта слово
 div bl  ;делим на 7, al - частное, ah - остаток
 cmp ah, 7  ;остаток = 7 - число заканчивается на 7
 jne next  ;не равен - игнорируем
 mov al, [si-1] ;равен - прочитаем его еще раз
 stosb   ;сохраним
 inc dx  ;посчитаем
next:
 loop mainLoop ;по всем
 mov ax, dx  ;ax = чисел, которые заканчиваются на 7

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


 end main

-----
Люби своего ближнего, как самого себя

Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 16.06.2011, 14:55
Номер ответа: 267758
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267758 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 183640:

    Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Дана целочисленная матрица в байтовом формате по строкам. Все операции обработки матрицы реализовать только циклами. При необходимости использовать макросы. Размерность 4х4. Найти общую сумму элементов последнего столбца и последней строки. Прошу как можно подробнее расписать комментарии к программе. Заранее благодарен.

    Отправлен: 16.06.2011, 12:22
    Вопрос задал: Посетитель - 377712 (Посетитель)
    Всего ответов: 1
    Страница вопроса »


    Отвечает Лысков Игорь Витальевич (Старший модератор) :
    Здравствуйте, Посетитель - 377712!
    Программа ничего не вводит и не выводит.
    Матрица задана в программе, результат смотрим в отладчике.
    Байты-числа знаковые, т.е. должны быть в интервале -128<N<+127.
    Будут вопросы - задавайте в мини-форуме.

    Код :
    ;Дана целочисленная матрица в байтовом формате по строкам. 
    ;Все операции обработки матрицы реализовать только циклами. 
    ;При необходимости использовать макросы. Размерность 4х4. 
    ;Найти общую сумму элементов последнего столбца и последней строки.
     
     .model small
    
     .stack 100h
    
    N equ 4  ;размерность матрицы
    
     .data
    array db   3, 100, 3,   4;примерная матрица 4х4
     db  -1,  -2,-3,  -4
     db   0,  19, 2,   3
     db -20, 120, 1, 127
    
     .code
    main proc
     mov ax, @DATA ;настроим сегментный регистр
     mov ds, ax  ;на сегмент данных
    
     xor dx, dx  ;искомая сумма
    
    ;посчитаем сумму элементов последненго столбца
     mov si, N-1  ;индекс столбца
     mov cx, N  ;число элементов в слолбце
     xor bx, bx  ;база строки матрицы (0, 4, 8, 12)
    LastColumnsSum:
     mov al, array[bx+si]; очередной байт 
     cbw   ;превратим знаковый байт al в знаковое слово ax
     add dx, ax  ;складываем
     add bx, N  ;на следующую строку
     loop LastColumnsSum ;по всем элементам столбца
    
    ;добавим сумму элементов последней строки
     xor si, si  ;индекс столбца
     mov cx, N  ;число элементов в строке
     mov bx, N*(N-1) ;база последней строки матрицы (12)
    LastRowSum:
     mov al, array[bx+si]; очередной байт 
     cbw   ;превратим знаковый байт al в знаковое слово ax
     add dx, ax  ;складываем
     inc si  ;на следующий элемент в строке
     loop LastRowSum ;по всем элементам столбца
     mov ax, dx  ;искомая сумма в регистре AX
    
     mov ax, 4c00h ;выход в ДОС
     int 21h
    
    main endp
    
     end main
    

    -----
    Люби своего ближнего, как самого себя

    Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
    Ответ отправлен: 16.06.2011, 14:00
    Номер ответа: 267756
    Украина, Кировоград
    Тел.: +380957525051
    ICQ # 234137952
    Mail.ru-агент: igorlyskov@mail.ru

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267756 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 183641:

    Здравствуйте! Прошу помощи в следующем вопросе: Дана двухбайтовая двоичная строка. Проинвертировать первый полубайт строки, сложить по модулю 2 со вторым полубайтом и записать на место четвертого полубайта.Прошу как можно подробнее расписать комментарии к программе. Заранее благодарен.

    Отправлен: 16.06.2011, 12:23
    Вопрос задал: Посетитель - 377712 (Посетитель)
    Всего ответов: 1
    Страница вопроса »


    Отвечает Лысков Игорь Витальевич (Старший модератор) :
    Здравствуйте, Посетитель - 377712!
    Полубайты нумеруем следующим образом:
    первый - младшие 4 бита младшего байта,
    вторый - старшие 4 бита младшего байта,
    третий - младшие 4 бита старшего байта,
    четвертый - старшие 4 бита старшего байта.

    Двоичная строка задана в программе.
    Результат смотрим в отладчике.

    Будут вопросы - обращайтесь в мини-форум

    Код :
    ;Дана двухбайтовая
    двоичная строка. 
    ;Проинвертировать первый полубайт строки, сложить по модулю 2 со вторым полубайтом 
    ;и записать на место четвертого полубайта.
    
     .model small
    
     .stack 100h
    
     .data
    bstring  dw 1011001111100010b ;наша строка
    
     .code
     .186   ;чтобы можно было использовать команду shl al,4
    
    main proc
     mov ax, @DATA
     mov ds, ax  ;настроим сегмент данных
    
     mov bx, bstring ;исходная двоичная строка
     mov al, bl  ;первый полубайт (старший игнорируем)
     not al  ;инвертируем байт
     shl al, 4  ;младший стал старшим, заместо младшего нули
     mov ah, bl  ;второй полубайт
     and ah, 0f0h ;оставляем только старшую (вторую) тетраду
     xor al, ah  ;складываем по модулю 2 старшую тетраду, в младшей 0
     and bh, 0fh  ;оставляем только третью (младшую) тетраду
     or bh, al  ;заместо старшей (четвертой) заносим результат пред опер
     mov bstring, bx ;сохраняем на место
    
     mov ax,4c00h ;выход в ДОС
     int 21h
    main endp
    
    
     end main
    

    -----
    Люби своего ближнего, как самого себя

    Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
    Ответ отправлен: 16.06.2011, 14:33
    Номер ответа: 267757
    Украина, Кировоград
    Тел.: +380957525051
    ICQ # 234137952
    Mail.ru-агент: igorlyskov@mail.ru

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267757 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 183639:

    Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
    Ввести произвольную символьную строку. Выделить из нее (с удалением из исходной строки) все цифры, сделать из них отдельную строку и записать их в файл.

    Отправлен: 16.06.2011, 12:20
    Вопрос задал: Посетитель - 377712 (Посетитель)
    Всего ответов: 1
    Страница вопроса »


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

    1) Удаляем цифры, получаем две строки: исходную, без цифр, и строку из одних цифр
    2) Выводим на экран обе строки (для наглядности)
    3) Имя файла задаем в теле, как digits.txt, и выводим туда строку из цифр
    4) В случае отсутствия символов любого типа (типа все цифры или ни одной цифры), выводится соответствующее сообщение

    Код :
    ;Ввести произвольную
    символьную строку. 
    ;Выделить из нее (с удалением из исходной строки) все цифры, 
    ;сделать из них отдельную строку и записать их в файл.
    
     .model small
     .stack 100h
     .code
    main proc
     mov ax, @data ;настроим сегменты данных
     mov ds, ax
     mov es, ax
    
     lea dx, sIn  ;строка приглашения 'Enter string:'
     mov ah, 9
     int 21h
    
     lea dx, buf  ;введем строку
     mov ah, 0ah
     int 21h
    
     lea si, string ;адрес строки
     lea di, digits ;адрес, куда запишем цифры
     mov bx, si  ;по старому адресу будем писать все остальные символы
    MainLoop:   ;цикл по строке
     lodsb   ;читаем очередной
     cmp al, 0dh  ;конец строки?
     je PrintResult ;на вывод результата
     cmp al, 30h  ;'0'
     jb SaveOther ;другие сохраним по адресу [bx]
     cmp al, 39h  ;'9'
     ja SaveOther ;другие сохраним по адресу [bx]
     stosb   ;заглавные сохраняем по адресу [di]
     jmp MainLoop ;на следующий символ
    SaveOther:   ;остальные
     mov [bx], al ;сохраняем
     inc bx  ;инкремент адреса
     jmp MainLoop ;на следующий символ
    
    PrintResult:   ;вывод результата
     push di  ;сохраним адрес конца в буфере цифр
    
        ;di - адрес конца выводимого буфера (цифр)
     lea dx, sDigitsOut ;адрес строки 'Digits:'
     lea bp, digits ;адрес начала выводимой строки цифр
     call OutMessage ;выводим данные
    
     mov di, bx  ;di - адрес конца выводимого буфера (остальных символов)
     lea dx, sOtherOut ;адрес строки 'Other:'
     lea bp, string ;адрес начала выводимой строки остальных букв
     call OutMessage ;выводим данные
    
     pop di  ;восстановим адрес конца в буфере заглавных букв
     call OutFile  ;выведем заглавные буквы в файл
    
    PressAny:
     lea dx, sAny ;выведем 'Press any key'
     mov ah, 9
     int 21h
    
     mov ah, 0  ; ждем нажатие на клавишу
     int 16h
    
     mov ax,4c00h ; конец работы
     int 21h
    main endp
    
    OutMessage proc  ;вывод строки с заголовком
     mov ah, 9  ;вывод заголовка, адрес в dx
     int 21h
    
     mov si, bp  ;адреса начала строки
     mov cx, di  ;адрес конца
     sub cx, si  ;длина строки
     mov ah, 2  ;функция вывода символа из dl
     jcxz NoMessage ;пустая строка?
    OutLoop:
     lodsb   ;символ
     mov dl, al  ;для вывода
     int 21h  ;выводим
     loop OutLoop  ;по всем cx символам
     ret
    NoMessage:   ;сообщение 'Not found'
     lea si, sNotFound ;начало строки
     mov cx, len_sNotFound;длина
     jmp OutLoop  ;на вывод
    OutMessage endp
    
    OutFile proc   ;вывод строки в файл
     lea dx, sName ;имя файла 'digits.txt'
     xor cx, cx  ;без атрибутов
     mov ah, 3ch  ;создаем
     int 21h
     jc CreateError ;ошибка создания?
     mov bx, ax  ;описатель файла
    
     lea dx, digits ;адрес строки цифр
     mov cx, di  ;адрес конца
     sub cx, dx  ;длина
     jcxz NoDigits ;есть цифры?
    Write:
     mov ah, 40h  ;выводим
     int 21h
     jc WriteError ;ошибка записи
    
     mov ah, 3eh  ;закрываем файл
     int 21h
     ret
    
    NoDigits:   ;сообщение 'Not found'
     lea dx, sNotFound ;начало строки
     mov cx, len_sNotFound;длина
     jmp Write  ;на вывод
    
    WriteError:   ;ошибка записи
     mov ah, 3eh  ;файл закрываем
     int 21h
     lea dx, sWriteErr ;сообщение об ошибке
     jmp PrintError
    CreateError:   ;ошибка создания
     lea dx, sCreateErr ;сообщение об ошибке
    PrintError:
     mov ah, 9  ;выводим сообщение
     int 21h
     ret
    OutFile endp
    
     .data
    
    ;строки сообщений
    sIn  db 0dh,0ah,'Enter string:  $'
    sDigitsOut db 0dh,0ah,'Digits: $'
    sOtherOut db 0dh,0ah,'Other : $'
    sAny  db 0dh,0ah,'Press any key$'
    
    sName  db 'digits.txt',0   ;имя файла
    sCreateErr db 0dh,0ah,'File create error!$'
    sWriteErr db 0dh,0ah,'File write error!$'
    sNotFound db 'Not found'   ;сообщение о ненахождении
    len_sNotFound equ $-sNotFound   ;длина сообщения
    
    buf label byte  ; буфер для приема строки с клавиатуры (по ф-и 0ah)
    max db 128  ; максимальная длина строки
    len db 0  ; реальная длина введенной строки
    string db 128 dup (?) ; сама строка
    
    digits db 128 dup (?) ;сюда запишем цифры
    
     end main
    

    -----
    Люби своего ближнего, как самого себя

    Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
    Ответ отправлен: 16.06.2011, 13:42
    Номер ответа: 267755
    Украина, Кировоград
    Тел.: +380957525051
    ICQ # 234137952
    Mail.ru-агент: igorlyskov@mail.ru

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267755 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


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

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

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

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

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

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

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



    В избранное