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

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


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

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

Чемпионы рейтинга экспертов в этой рассылке

Boriss
Статус: Академик
Рейтинг: 2489
∙ повысить рейтинг »
_Ayl_
Статус: Профессионал
Рейтинг: 1869
∙ повысить рейтинг »
vladisslav
Статус: 6-й класс
Рейтинг: 1227
∙ повысить рейтинг »

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

Номер выпуска:1354
Дата выхода:08.06.2010, 11:30
Администратор рассылки:Лысков Игорь Витальевич, Модератор
Подписчиков / экспертов:241 / 61
Вопросов / ответов:3 / 4
IRC-канал по теме:#assembler

Вопрос № 178823: Здравствуйте уважаемые эксперты! Помогите пожалуйста решить задачу на ассемблере: Имеется предложение из нескольких слов. Переставить все пробелы в начало строки. Дополнительных строк не использовать. Выдать на печать число пробелов и модифици...


Вопрос № 178825: Здравствуйте уважаемые эксперты! Помогите пожалуйста решить задачу на ассемблере: Имеется строка длиной до 100 символов, в которой несколько раз встречается сочетание "школьник". Сформировать строку, содержащую вмест о указанного соч...
Вопрос № 178826: Здравствуйте уважаемые эксперты! Помогите пожалуйста решить задачу на ассемблере: Задана строка символов. Составить программу, выясняющую, имеется ли в ней все буквы из слова "begin". Порядок букв не важен. В ассемблере я не о...

Вопрос № 178823:

Здравствуйте уважаемые эксперты! Помогите пожалуйста решить задачу на ассемблере:

Имеется предложение из нескольких слов. Переставить все пробелы в начало строки. Дополнительных строк не использовать. Выдать на печать число пробелов и модифицированную строку.

В ассемблере я не очень, так что прошу с подробными комментариями. Программа Tasm 5.0.

Отправлен: 03.06.2010, 11:23
Вопрос задал: Петров Юрий Иванович, Посетитель
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич, Модератор :
Здравствуйте, Петров Юрий Иванович.
Вот Вам программа, решающая задачу.
Решаем путем сдвига "непробельных" символов к правому краю с последующим
заполнением до начала строки пробелами.
Код:

.model small
.data
sAny db 0dh,0ah,'Press any key$'
string db ' word1 12345 word2 word3$'
sCount db 'Count of spaces = $'

.code
.286
.startup ;данное макро настраивает сегмент SS и DS
mov ax, @DATA ;надо еще и ES
mov es, ax

lea di, string ;исследуемая строка
call MoveSpaces ;переносим пробелы в начало
;получим в cx число пробелов
lea dx, sCount
mov ah, 9
int 21h ;выведем количество пробелов
mov ax, cx ;количество
call PrintNum ;выведем чис ло

mov al, 0dh ;перевод строки
int 29h
mov al, 0ah
int 29h

lea dx, string ;модифицированная строка
mov ah, 9
int 21h

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

mov ah,0
int 16h ;ждем нажатия на клавишу

mov ax, 4c00h
int 21h

MoveSpaces proc ;переносим пробелы в начало
or cx, -1 ;посчитаем длину строки
mov al, '$' ;ищем признак конца строки
repne scasb
not cx ;cx = длине строки + 1

lea di, [di-2] ;на позицию последнего символа
mov si, di ;будем писать по адресу [si]
std ;автодекремент
search_loop:
mov al, ' ' ;ищем пробел
repe scasb
jcxz spaces ;cx=0, когда пройдем всю строку
mov al, [di+1] ;найденный "непробел"
mov [si], al ;сдвигаем на правый край
dec si ;на следующий адрес
jmp search_loop ;пока не пройдем строку
spaces: ;пропишем до начала строки пробелами
xor cx, cx ;и посчитаем
;al = ' '
spaces_loop:
cmp si, offset string
jb finish ;сравниваем, прошли ли начало
mov [si], al ;пишем пробел
dec si
inc cx
jmp spaces_loop
finish:
cld ;вернем автоинкремент
ret
MoveSpaces endp

PrintNum proc ;выводим число из ax
xor cx, cx ;счетчик цифр
mov bx, 10 ;будем делить на 10
PrDiv: ;цикл поиска цифр
xor dx, dx ;подготавливаемся к делению
div bx ;делим dx:ax на 10
push dx ;остаток = очередной цифре
inc cx ;считаем
test ax, ax ;еще есть?
jnz PrDiv
PrOut: ;цикл вывода
pop ax ;извлекаем из стека цифры в обратном порядке
or al, '0' ;0-9 в '0'-'9'
int 29h ;выводим
loop PrOut ;всего cx цифр
ret
PrintNum endp

end

-----
Удачи!

Ответ отправил: Лысков Игорь Витальевич, Модератор
Ответ отправлен: 03.06.2010, 21:31
Номер ответа: 261862
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru
Абонент Skype: igorlyskov

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

  • Вопрос № 178825:

    Здравствуйте уважаемые эксперты! Помогите пожалуйста решить задачу на ассемблере:

    Имеется строка длиной до 100 символов, в которой несколько раз встречается сочетание "школьник". Сформировать строку, содержащую вмест о указанного сочетания строку с сочетанием "студент".

    В ассемблере я не очень, так что прошу с подробными комментариями. Программа Tasm 5.0.

    Отправлен: 03.06.2010, 11:26
    Вопрос задал: Петров Юрий Иванович, Посетитель
    Всего ответов: 1
    Страница вопроса »


    Отвечает Лысков Игорь Витальевич, Модератор :
    Здравствуйте, Петров Юрий Иванович.
    Вот программа. Выводит исходную строку и результат замены
    Обратите внимание, что русские буковки в ANSI кодировке. Поэтому либо перекодируйте в ASCII,
    либо загрузите прикрепленый файл
    Код:

    .model small
    .data
    sAny db 'Press any key$'
    string1 db '12345 школьник пошел в школу. Там были другие школьники',0
    string2 db 100 dup (?)
    str1 db 'школьник'
    len_str1 equ $-str1
    str2 db 'студент'
    len_str2 equ $-str2

    .code
    .startup ;данное макро настраивает сегмент SS и DS (посмотрите в листинге - параметр /la)
    mov ax, @DATA ;надо еще и ES
    mov es, ax

    lea si, string1
    call PrintString ;выведем исходную строку

    call ChangeStrin g ;заменим школьника на студента

    lea si, string2
    call PrintString ;выведем результат

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

    mov ah,0
    int 16h ;ждем нажатия на клавишу

    mov ax, 4c00h
    int 21h

    PrintString proc ;выводим строку
    lodsb
    cmp al, 0 ;0 - признак конца
    je PS_ret
    int 29h ;выводит символ из al
    jmp PrintString
    PS_ret:
    mov al, 0dh ;в конце - перевод строки
    int 29h
    mov al, 0ah
    int 29h
    ret
    PrintString endp

    ChangeString proc ;замена школьника на студента
    lea si, string1 ;исходная строка
    lea di, string2 ;результат
    CS_loop:
    cmp byte ptr [si], 0;конец строки
    je CS_ret
    push di ;сравним строки [si] и [di]='школьник'
    push si
    lea di, str1
    mov cx, len_str1 ;длина
    repe cmpsb ;сравниваем ds:si es:di
    pop si
    pop di
    jz InsertStudent ;равно - пишем 'студент'
    movsb ;не равно - просто копируем байт
    jmp CS_loop ;на следующий байт исходной строки
    InsertStudent:
    add si, len_str1 ;обойдем 'школьник'
    push si ;сохраним адрес
    lea si, str2 ;копируем 'студент'
    mov cx, len_str2 ;длина
    rep movsb
    pop si ;si - адрес байта за школьником
    jmp CS_loop
    CS_ret:
    ret
    ChangeString endp

    end
    Прикрепленный файл: загрузить »

    -----
    Удачи!

    Ответ отправил: Лысков Игорь Витальевич, Модератор
    Ответ отправлен: 03.06.2010, 14:16
    Номер ответа: 261843
    Украина, Кировоград
    Тел.: +380957525051
    ICQ # 234137952
    Mail.ru-агент: igorlyskov@mail.ru
    Абонент Skype: igorlyskov

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

  • Вопрос № 178826:

    Здравствуйте уважаемые эксперты! Помогите пожалуйста решить задачу на ассемблере:

    Задана строка символов. Составить программу, выясняющую, имеется ли в ней все буквы из слова "begin". Порядок букв не важен.

    В ассемблере я не очень, так что прошу с подробными комментариями. Программа Tasm 5.0.

    Отправлен: 03.06.2010, 11:28
    Вопрос задал: Петров Юрий Иванович, Посетитель
    Всего ответов: 2
    Страница вопроса »


    Отвечает Лысков Игорь Витальевич, Модератор :
    Здравствуйте, Петров Юрий Иванович.
    Программа под ДОС
    Проверяет введенную строку.
    Код:

    .model small
    .data
    max db 81 ;максимальная длина буфера
    count db 0 ;реальная длина строки
    string db 81 dup (?) ;сам буфер

    sPrompt db 'Enter string: $'
    sBegin db 'begin'
    lenBeg equ $-sBegin ;длина строки
    sYes db 0dh,0ah,'All letters are found!$'
    sNo db 0dh,0ah,'Some letters are NOT found!$'
    sAny db 0dh,0ah,'Press any key$'

    .code
    .startup ;данное макро настраивает сегмент SS и DS (посмотрите в листинге - параметр /la)
    mov ax, @DATA ;надо еще и ES
    mov es, ax

    lea dx, sPrompt ;подсказка
    mov ah, 9
    int 21h

    lea dx, max ;вводим строку
    mov a h, 0ah
    int 21h

    call Search ;ищем
    lea dx, sYes ;формируем адрес строки сообщения
    jz PrintMess ;флаг FZ=1 - найдены все буковки
    lea dx, sNo
    PrintMess:
    mov ah, 9
    int 21h

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

    mov ah,0
    int 16h ;ждем нажатия на клавишу

    mov ax, 4c00h
    int 21h

    Search proc ;поиск
    xor bx, bx
    mov bl, count ;длина введенной строки
    lea si, sBegin ;адрес строки 'begin'
    mov cx, lenBeg ;длина строки 'begin'
    Search_loop:
    lodsb ;очередной байт из строки 'begin'
    push cx ;сохраним счетчик байт
    lea di, string ;введенная строка
    mov cx, bx ;ее длина
    repne scasb ;ищем байт al в es:[di]
    pop cx
    jne Search_not_found;увы, не нашли
    loop Search_loop ;пока не найдем все
    xor ax, ax ;ура! нашли все (FZ=1)
    ret
    Search_not_found:
    or ax, 1 ;чтобы FZ=0
    ret
    Search endp

    end

    -----
    Удачи!

    Ответ отправил: Лысков Игорь Витальевич, Модератор
    Ответ отправлен: 03.06.2010, 13:37
    Номер ответа: 261840
    Украина, Кировоград
    Тел.: +380957525051
    ICQ # 234137952
    Mail.ru-агент: igorlyskov@mail.ru
    Абонент Skype: igorlyskov

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

  • Отвечает Alex_S, 8-й класс :
    вот еще 16-разрядный вариант с использованием цепочечных команд и подпрограммами в стиле "C"
    при наличии всех необходимых символов выдается звуковой сигнал

    Приложение:

    -----
    йо-хо-хо!

    Ответ отправил: Alex_S, 8-й класс
    Ответ отправлен: 03.06.2010, 14:17
    Номер ответа: 261844

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

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

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

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

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

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

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

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


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.16 от 26.05.2010

    В избранное