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

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


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

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

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

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

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

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

Вопрос № 183247: Здравствуйте! Прошу помощи в следующем вопросе: Помогите пожалуйста со следующим заданием. Задание на фото ниже ...


Вопрос № 183248: Здравствуйте! Прошу помощи в следующем вопросе: Помогите пожалуйста со следующим заданием. Задание на фото ниже ( Нужен один из 6 представленных вариантов) Вопрос № 183249: Здравствуйте! У меня возникли сложности с таким вопросом: Помогите пожалуйста со следующим заданием. Задание подробно описано в текстовом документе. Нужно выполнить 1 из 12 предложенных вариантов(на ваше усмотрение) Просьба писать комментари...
Вопрос № 183250: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: требуется составить подпрограмму решения задачи, использующую инструкции обработки цепочек. Составить программу, осуществляющую ввод необходимых данных, вызов подпрограммы и...

Вопрос № 183247:

Здравствуйте! Прошу помощи в следующем вопросе:
Помогите пожалуйста со следующим заданием.
Задание на фото ниже

Отправлен: 19.05.2011, 19:08
Вопрос задал: Посетитель - 349343 (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Зенченко Константин Николаевич (Модератор) :
Здравствуйте, Посетитель - 349343!

№1
1) размер операндов не совпадает 123h - слово, а не байт
2,3)нормально
4)не правильный индексный регистр и нужно указывать тип операнда
5)нормально
6)не правильно: передача данных пернеменная-переменная
7)не правильно: одноверменное использование сегментных регистров
8)непосредственное указание сегментного адреса
9)не правильно: передача данных пернеменная-переменная
10)нормально

№2
+3/32=0.00011
-9/16=1.0111
-0 = не определено

№3
AX=20H

№4
0110'0010'1010'0000=AX
1001'1101'0101'0000=+
=
1111'1111'1111'0000=AX
устатновлен флаг SF, остальные сброшены.
Удачи!
-----
Итерация от человека. Рекурсия — от Бога. — Л. Питер Дойч

Ответ отправил: Зенченко Константин Николаевич (Модератор)
Ответ отправлен: 23.05.2011, 16:01
Номер ответа: 267313
Украина, Киев
Тел.: +38-097-238-60-03
Адрес: Украина, Киев

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


  • Вопрос № 183248:

    Здравствуйте! Прошу помощи в следующем вопросе:
    Помогите пожалуйста со следующим заданием.
    Задание на фото ниже ( Нужен один из 6 представленных вариантов)

    Отправлен: 19.05.2011, 19:15
    Вопрос задал: Посетитель - 349343 (Посетитель)
    Всего ответов: 1
    Страница вопроса »


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

    Реализован поиск по правилу 2: быть числами < 7
    Те, которые < 7, переносятся в RES (с удалением из исходного), >=7 остаются в MAS
    После вызова ф-и OBRAB в AX адрес массива RES, в CX - число перенесенных чисел, в BX - число оставленных чисел

    main.asm

    Код :
    extrn OBRAB:near  ;чтобы было доступно из данного модуля
    
    cseg segment para public 'code'  ;сегмент кода
    assume cs:cseg, ds:dseg, es:dseg  ;свяжем сегментные регистры с указанными сегментами
    start: mov ax, dseg ;загрузим сегментные регистры DS, ES
     mov ds, ax  ; адресом сегмента данных
     mov es, ax
    
     call OBRAB  ;вызовем п/п анализа массива
    
     mov ax, 4c00h ;выход в ДОС
     int 21h
    cseg ends
    
    public MAS, MASend  ;чтобы были доступны извне
    extrn RES:byte  ;чтобы было доступно из данного модуля
    
    dseg segment public 'data'
    MAS db -6, -1, 7, 'n', 8, -3, 9, 0, 'N', 4
    MASend label byte  ;зададим для подсчета длины строки в модуле SORT
    dseg ends
    
     end start
    


    sort.asm

    Код :
    cseg segment para public 'code'  ;сегмент кода
    assume cs:cseg, ds:dseg, es:dseg  ;свяжем сегментные регистры с указанными сегментами
    
    public OBRAB   ;чтобы была доступна извне
    OBRAB proc near  ;п/п анализа массива из модуля MAIN
     lea si, MAS  ;адрес массива
     lea cx, MASend ;адрес конца
     sub cx, si  ;длина массива
     lea di, RES  ;адрес, куда переместим элементы
     xor dx, dx  ;количество найденных и перемещенных элементов
     mov bx, si  ;адрес исходного массива, куда будем писать оставленные элементы
    obrabLoop:   ;цикл по всем
     lodsb   ;очередной элемент массива
     cmp al, 7  ;сравниваем с 7
     jge obrabSave ;сравнение знаковое!
     stosb   ;все, кто меньше 7 (-6,-1,-3,0,4) переносим
     inc dx  ;считаем
     jmp obrabNext
    obrabSave:
     mov [bx], al ;остальных оставляем
     inc bx  ;адрес конца оставленных
    obrabNext:
     loop obrabLoop ;по всем
     mov cx, dx  ;вернем количество перенесенных в cx
     lea ax, RES  ;адрес массива в ax
     sub bx, offset MAS ;в bx - количество оставленных
     ret
    OBRAB endp
    cseg ends
    
    extrn MAS:byte, MASend:byte ;адреса, определенные в другом модуле
    public RES   ;адрес, определенный в данном, будет доступен извне
    
    dseg segment public 'data'
    RES db 10 dup (?) ;результирующий массив
    dseg ends
    
     end
    
    

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

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

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


  • Вопрос № 183249:

    Здравствуйте! У меня возникли сложности с таким вопросом:
    Помогите пожалуйста со следующим заданием.
    Задание подробно описано в текстовом документе. Нужно выполнить 1 из 12 предложенных вариантов(на ваше усмотрение)
    Просьба писать комментарии к каждой операции.

    Задание

    Отправлен: 19.05.2011, 19:24
    Вопрос задал: Посетитель - 349343 (Посетитель)
    Всего ответов: 1
    Страница вопроса »


    Отвечает Лысков Игорь Витальевич (Старший модератор) :
    Здравствуйте, Посетитель - 349343!
    Вот и программа
    Реализовал вариант 1: по таймеру (прерыванию 1сh) выводится сообщение
    Чтобы не было слишком часто, сделал, чтобы выводилось раз в 2 секунды
    Выходит из программы по нажатию на любую клавишу

    Код :
     .model small
    
    assume cs:code, ds:data, ss:stack
    
    stack segment para public 'stack'
     dw 1024 dup (?)
    stack ends
    
    MAX_COUNT equ 36 ;прерывание будет рисовать сообщение каждые MAX_COUNT/18 секунды
    
    data segment para public 'data'
    count dw MAX_COUNT
    sPress db 0dh,0ah,'Press any key for exit...$'
    string db 0dh, 0ah, 'Hi from interrupt!',0
    Off_1c dw ?  ;указатель на старый обработчик вектора 1ch
    Seg_1c dw ?
    data ends
    
    code segment para public 'code'
    start:
     jmp Init  ;на инициализацию
    new_1c:    ;подпрограмма отработки 1ch
     push ds  ;сохраним использованные регистры
     push ax
     push si
     mov ax, data ;ds=data
     mov ds, ax
     dec count  ;уменьшваем счетчик
     jnz call_old_1c ;если не 0, то ничего не делаем
     mov count, MAX_COUNT;загрузим заново
     lea si, string ;адрес строки
     mov ah, 0eh  ;ф-я вывода телетайпом
    str_loop:   ;выводим строку
     lodsb   ;читаем символ
     cmp al, 0  ;проверим на конец
     je call_old_1c
     int 10h  ;выводим на экран
     jmp str_loop
    call_old_1c:
     pushf   ;вызовем старый обработчик, сначала надо pushf, т.к. выход по iret!
     call dword ptr Off_1c;адрес переменной в сегменте данных
     pop si
     pop ax
     pop ds  ;восстановим регистры
     iret   ;возврат из прерывания
    
    Init:    ;инициализация
     mov ax, data
     mov ds, ax  ;ds = data
    
     mov ax, 351ch
     int 21h  ;узнаем вектор 1ch в es:bx
    
     mov Off_1c, bx ;сохраним старый адрес в сегменте данных
     mov Seg_1c, es
    
     push ds
     lea dx, new_1c ;установим новый адрес
     push cs  ;обработчика прерывания 1ch
     pop ds  ;ds:dx
     mov ax, 251ch
     int 21h
     pop ds
    
     lea dx, sPress ;выведем приглашение нажать на любую клавишу
     mov ah, 9
     int 21h
    
     mov ah, 0  ;ждем
     int 16h
    
     cli   ;воcстановим старый обработчик вектора 1ch
     push ds  ;ds
     lds dx, dword ptr Off_1c ;ds:dx - адрес старого вектора
     mov ax, 251ch
     int 21h  ;восстановим!
     pop ds   ;ds = data
     sti
    
     mov ax, 4c00h
     int 21h  ;выход в ДОС
    
    code ends
    
     end start
    

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

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

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


  • Вопрос № 183250:

    Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
    требуется составить подпрограмму решения задачи, использующую инструкции обработки цепочек. Составить программу, осуществляющую ввод необходимых данных, вызов подпрограммы и вывод результата.
    Задача- удалить подстроку из строки. Ассемблер-TASM. EXE. Очень надеюсь, что Вы мне поможете.

    Отправлен: 19.05.2011, 19:59
    Вопрос задал: Дмитрий (Посетитель)
    Всего ответов: 1
    Страница вопроса »


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

    Код :
     .model small, C ;параметры обрабатываются, как в С
     .data
    ;буфер для приема основной строки по ф-и 0ah
    buf1 db 80
    cnt1 db 0
    str1 db 80 dup (?)
    
    ;буфер для приема удаляемой подстроки по ф-и 0ah
    buf2 db 80
    cnt2 db 0
    str2 db 80 dup (?)
    
    sStr db 'Enter main string: ',0
    sSubStr db 0dh, 0ah, 'Enter substring: ',0
    sRes db 0dh, 0ah, 'Result: ',0
    sAny db 0dh, 0ah, 'Press any key',0
     .code
     .186  ;чтобы было возможно push <число>
    start:
     mov ax, @DATA
     mov ds, ax
     mov es, ax
    
    ;введем основную строку
     call GetStr, offset buf1, offset sStr
    ;введем подстроку
     call GetStr, offset buf2, offset sSubStr
    ;удалим подстоку
     call DelSubStr, offset str1, offset str2
    ;выведем результат
     call Print, offset sRes
     call Print, offset str1
    
    ;ждем нажатия на любую клавишу
     call Print, offset sAny
     mov ah, 0
     int 16h
    
    ;выход в ДОС
     mov ax, 4c00h
     int 21h
    
    ;вывод строки ASCIIZ
    Print proc string:word
     mov si, string
    PrintLoop:
     lodsb
     cmp al, 0  ;конец строки?
     je PrintRet
     int 29h  ;вывод байта из al
     jmp PrintLoop
    PrintRet:
     ret
    Print endp
    
    ;ввод строки
    GetStr proc sBuf:word, sTitle:word
     call Print, sTitle ;вывод приглашения
    
     mov dx, sBuf ;ввод строки
     mov si, dx  ;сохраним адрес структуры
     mov ah, 0ah
     int 21h
    
     xor bx, bx  ;заменим последний байт 0dh на 0
     mov bl, byte ptr [si+1] ;длина строки
     mov byte ptr [bx+si+2], 0 ;меняем
     ret
    GetStr endp
    
    strlen proc pstr:word ;длина строки ASCIIZ
     push di
     mov di, pstr
     mov cx, 0ffffh ;побольше  
     mov al, 0
     repne scasb  ;ищем завершающий 0
     mov ax, di  ;di показывает на байт за 0 
     sub ax, pStr ;длина строки + 1
     dec ax  ;0 не учитываем
     pop di
     ret
    strlen endp
    
    ;поиск подстроки и если найдена, то удаление
    ;s1 - основная строка
    ;s2 - подстрока
    DelSubStr proc s1:word, s2:word
     call strlen, s2 ;ищем длину под строки
     mov bx, ax  ;сохраним
     call strlen, s1 ;длина основной
     mov dx, ax  ;сохраним
     mov cx, ax  ;посчитаем варианты вхождения
     sub cx, bx  ;равно разнице длин
     jl DSS_ret  ;если подстрока длиннее, то на выход
     mov di, s1  ;адрес основной
     mov si, s2  ;адрес подстроки
    DSS_Search:   ;цикл поиска
     push cx  ;сохраним ренистры
     push si
     push di
     mov cx, bx  ;длина подстроки
     repe cmpsb  ;сравниваем, пока равно
     pop di  ;восстановим
     pop si
     pop cx
     je DSS_found ;если равно, то на удаление
     inc di  ;увеличиваем начало поиска в основной строке
     jcxz DSS_ret  ;все ли варианты вхождения прошли
     dec cx
     jmp DSS_Search ;на повтор
    DSS_found:   ;нашли подстроку!
     lea si, [bx+di] ;адрес начала хвоста, который надо переписать 
        ; на место найденной подстроки
     mov cx, dx  ;длина основной строки
     sub cx, si  ;cx = cx - (si - s1)
     add cx, s1  ;cx - длина хвоста
     inc cx  ;вместе с 0
     rep movsb  ;копируем
    DSS_ret:
     ret
    DelSubStr endp
    
     end start
    

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

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

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


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

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

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

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

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

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

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



    В избранное