Вопрос № 38759: Здравствуйте!!
Вот, начал изучение ассемблера по книге Калашникова, всё здорово, вот только пытаюсь сотворить кое-что своё, а оно неполучаеться!! В частности хотелось чтбы программа выдавала на экран ASCII коды нажимаемых на клавиатуре клавиш (не...Вопрос № 38783: Уважаемые эксперты!
Как быстро нарисовать график массива данных в отдельной области окна и в полноэкранном режиме на MASM32?...Вопрос № 38819: Уважаемые
как найти значение выражения например х/5 (х/6, х/10 и т.д.) без команд деления и умножения (div mul) а только применяя команды сдвига сложения и вычитания???...
Вопрос № 38.759
Здравствуйте!!
Вот, начал изучение ассемблера по книге Калашникова, всё здорово, вот только пытаюсь сотворить кое-что своё, а оно неполучаеться!! В частности хотелось чтбы программа выдавала на экран ASCII коды нажимаемых на клавиатуре клавиш (не расширенных), вместо этого выдаётся мусор... Почему он выдаётся и как сделать задуманное??? Листинг прилагаю (программа .COM)!!!
Отвечает: Евгений Иванов
Здравствуйте, Симоненко Алексей Сергеевич!
Вот тебе программка, изучай.
Небольшой кусочек:
;Заносит в память по адресу 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 вернет указатель на контекст экрана - для рисования на экране
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