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

RusFAQ.ru: программирование на языке Assembler


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

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 416
от 03.04.2006, 05:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 295, Экспертов: 26
В номере:Вопросов: 3, Ответов: 7


Вопрос № 38759: Здравствуйте!! Вот, начал изучение ассемблера по книге Калашникова, всё здорово, вот только пытаюсь сотворить кое-что своё, а оно неполучаеться!! В частности хотелось чтбы программа выдавала на экран ASCII коды нажимаемых на клавиатуре клавиш (не...
Вопрос № 38783: Уважаемые эксперты! Как быстро нарисовать график массива данных в отдельной области окна и в полноэкранном режиме на MASM32?...
Вопрос № 38819: Уважаемые как найти значение выражения например х/5 (х/6, х/10 и т.д.) без команд деления и умножения (div mul) а только применяя команды сдвига сложения и вычитания???...

Вопрос № 38.759
Здравствуйте!!
Вот, начал изучение ассемблера по книге Калашникова, всё здорово, вот только пытаюсь сотворить кое-что своё, а оно неполучаеться!! В частности хотелось чтбы программа выдавала на экран ASCII коды нажимаемых на клавиатуре клавиш (не расширенных), вместо этого выдаётся мусор... Почему он выдаётся и как сделать задуманное??? Листинг прилагаю (программа .COM)!!!

Приложение:

Отправлен: 28.03.2006, 14:51
Вопрос задал: Симоненко Алексей Сергеевич (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Евгений Иванов
Здравствуйте, Симоненко Алексей Сергеевич!
Вот тебе программка, изучай.

Небольшой кусочек:


    ;Заносит в память по адресу DI число в AX,десятичное
    proc PrintDecToMem
    pusha
    sub bx,bx
    sub si, si

    cmp ax, 10000 ;делим на коэффициент, если подходит по величине
    jc m001
    sub dx, dx
    mov cx,10000
    div cx
    call dec12
    inc si
    m001:
    or si, si
    jnz m001_
    cmp ax, 1000
    jc m002
    m001_:
    sub dx, dx
    mov cx,1000
    div cx
    call dec12
    m002:
    mov cl,100
    div cl
    movzx dx,ah
    call dec12

    mov cl,10
    div cl
    movzx dx,ah
    call dec12

    inc bx
    call dec12

    mov [bptr di], 36
    popa
    ret

    dec12:
    add al,48
    cmp al,48
    jnz dec22
    or bx,bx
    jnz dec32
    jmp ret0 ;первые незначащие нули не выводим

    dec22:
    inc bx
    dec32:
    mov [di],al
    inc di
    ret0:
    mov ax,dx
    ret
    endp


Прикреплённый файл: Загрузить >>
Срок хранения файла на сервере RusFAQ.ru составляет 30 суток с момента отправки ответа.
---------
Что имеем - не храним, потерявши - плачем

Ответ отправил: Евгений Иванов (статус: Профессор)
Россия, Нижний Новгород
Тел.: +79087645721
Организация: M2Media.ru
Адрес: Нижний Новгород, ул.Малая Ямская, д. 66
WWW: Eugene Ivanov
ICQ: 214;88;90;76
----
Ответ отправлен: 28.03.2006, 15:11

Отвечает: Joy~
Здравствуйте, Симоненко Алексей Сергеевич!
Почему мусор у Вас на экране да потому что Функция 09 прерывания 21h ЭТО
Вывод строки заканчивающейся знаком $ те
String db 'Message$'
Загружаем адрес этой строки в DX регистр.
mov ah,9
mov dx,offset String
int 21h
И на экране появится Сообщение. А в вашей програмке этого нет и поетому мусор.
;********************************************************************
Вот программа.
cseg segment
assume cs:cseg,ds:cseg,es:cseg,ss:cseg
org 100h
Start:
mov ax,3
int 16
sub di,di
mov ax,0B800h
mov es,ax
Begin:
mov ah,10h
int 16h
cmp al,0
jz Begin
cmp al,1Bh
jz Quit
call SymVivod
jmp Begin
Quit:
mov dx,offset Vyhod
mov ah,9h
int 21h
int 20h
SymVivod proc
mov ah,29
mov es:[di],ax
add di,2
ret
SymVivod endp
Vyhod db 'OUT!$'
cseg ends
end Start
---------
Прорвёмся....
Ответ отправил: Joy~ (статус: 4-ый класс)
Ответ отправлен: 28.03.2006, 16:10

Отвечает: Пан Павел Константинович
Здравствуйте, Симоненко Алексей Сергеевич!

Как настроение?
Вот попробуйте так:
CSEG segment
assume cs:CSEG,ds:CSEG,ss:CSEG,es:CSEG
org 100h
Begin:
mov ah,10h
int 16h
cmp al,1bh ;Esc
je L1
mov ah,2h
mov dl,al
int 21h
jmp Begin
L1:
int 20h
CSEG ends
end Begin

С, Уважением MnEm0n!C.

Приложение:

---------
Hello Worlds

Ответ отправил: Пан Павел Константинович (статус: 4-ый класс)
Ответ отправлен: 29.03.2006, 06:12


Вопрос № 38.783
Уважаемые эксперты!
Как быстро нарисовать график массива данных в отдельной области окна и в полноэкранном режиме на MASM32?
Отправлен: 28.03.2006, 19:39
Вопрос задал: Kuran (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Хузин Макс
Здравствуйте, Kuran!
А на сколько быстро надо?

Посмотри функции: CreateDC, CreateCompatibleDC, CreateDIBSection, SelectObject, BitBlt.
1.
;создаешь контекст устройства - в итоге получаешь хендл
invoke CreateDC, addr szDisplay, NULL, NULL, NULL
mov hdc,eax

1.а
;можно взять хендл уже созданного устройства
invoke GetDC, xxx
mov hdc, eax
xxx - handle окна getdc вернет указатель на контест окна - для рисования в окне
ххх - null - getdc вернет указатель на контекст экрана - для рисования на экране

2.
;по хендлу находишь параметры устройства
invoke GetDeviceCaps, hdc, HORZRES
mov dwWidth,eax
invoke GetDeviceCaps, hdc, VERTRES
mov dwHeight,eax
invoke GetDeviceCaps, hdc, BITSPIXEL
mov dwBPP,eax

3.
;получаешь указатель на память устройства
invoke CreateCompatibleDC, hdc

4.
в итоге eax содержит адрес памяти, зная размеры и глубину цвета (dwWidth, dwHeight, dwBPP) - можешь смело начинать рисовать график по точкам

З.Ы. посмотри приложение, там процедура которая капчурит экранную область и записывает ее в файл

Приложение:

Ответ отправил: Хузин Макс (статус: 2-ой класс)
Ответ отправлен: 29.03.2006, 09:23


Вопрос № 38.819
Уважаемые
как найти значение выражения например х/5 (х/6, х/10 и т.д.) без команд деления и умножения (div mul) а только применяя команды сдвига сложения и вычитания???
Отправлен: 29.03.2006, 05:03
Вопрос задал: Kotov V V (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Пан Павел Константинович
Здравствуйте, Kotov V V!
x*5:
AL = x
#ASM#
mov ah,al
shr al,2
add al,ah
#END#
x/5:
5/5 -> 4/4 = 1 5 -1 X=5,Y=1
10/5 -> 8/4 = 2 10-2 X=10,Y=2
15/5 -> 12/4= 3 15-3 ......
20/5 -> 16/4= 4 20-4 .....
25/5 -> 20/4= 4 25-5 .....
#ASM#
Можно это реализовать как деление на 4 но! надо от X-Y, где Y = {1,2,3....N+1}
Вопрос как найти этот Y Хммм... я токо придумал путем, захода в цикл, X-5, сравнения X c 5, увеличение Y на 1.

C, Уважением MnEm0n!C.

---------
Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 4-ый класс)
Ответ отправлен: 29.03.2006, 07:56

Отвечает: Лысков Игорь Витальевич
Здравствуйте, Kotov V V!
Могу предложить частное решение x/10 для 32-битных регистров
Корректно работает для x < 10004H
На входе EAX - частное, результат тоже в EAX
Взято здесь http://www.wasm.ru/print.php?article=1010028

Приложение:

---------
Удачи!

Ответ отправил: Лысков Игорь Витальевич (статус: Студент)
Ответ отправлен: 29.03.2006, 12:10

Отвечает: Хузин Макс
Здравствуйте, Kotov V V!

;----------------------------------------------
Вычитание: x/n = x - result*n + ostatok

mov ax, x
mov bx, n ;n=5,6,10 и т.д.
mov cx, -1

l1:
inc cx
sub ax, bx
jnb l1
neg ax

В итоге в cx - результат, в ax - остаток
;--------------------------------------------------
Вычитание + сдвиг

mov ax, x
mov bx, n
xor cx, cx
xor dx, dx

;подготовка к делению - делитель сдвигается влево до первой еденицы
;в cx устанавливается первый значащий разряд результата
l1:
inc cx
rcl bx, 1
jnb l1
rcr
dec cx

;непосредственно деление
l2:
;сравниваем делимое и делитель
cmp ax, bx
jb l3
;если делимое больше делителя, то вычитаем из него делитель и
;устанавливаем соответсвующий разряд результата
;сбрасывать разряды результата нет смысла, т.к. они сброшены комадой xor dx,dx
sub ax, bx
bts dx, cl

l3:
;сдвигаем делитель
shr bx, 1
;уменьшаем значение разряда результата
sub cx, 1
jnc l2

в итоге в dx - результат, ax - остаток
;-----------------------------------------------------------

Есть еще варианты деления, но там более сложные алгоритмы

Ответ отправил: Хузин Макс (статус: 2-ой класс)
Ответ отправлен: 29.03.2006, 14:17


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

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.21 (beta) от 02.04.2006
Яндекс Rambler's Top100

В избранное