Показать полную графическую версию : Assembler
shurikan
15-11-2003, 01:52
MER
mov *ah,10h
int *16h
...
mov *ax,4C00
int *21h
Вот так и считываем нажатие и код клавиши... А пока ждём нажатия, прога, естественно, стоит... И экран сохраняется
Исправлено: shurikan, 5:57 18-11-2003
data SEGMENT
mes1 db 'Enter',0Ah,0Dh,'$'
aadb 6,?
adb 5 dup (?)
data ENDS
text SEGMENT
assume CS:text, DS:data, SS:sts
main proc far
push DS
xor AX,AX
push ax
mov ax,data
mov DS,AX
lea DX,mes1
mov AH,09h
int 21h
lea DX,aa
mov AH,0Ah
int 21h
;---------------------------
Таким образом я ввожу данные с клавы. Как введенные мной данные поместить в какой-нибудь регистр (АХ например), чтобы в отладчике я мог видеть это число (понятно в шест. сист. счисления)? подскажите пожалуйста кто знает
shurikan
18-11-2003, 04:55
MER
Далее...
[code]
* * lea * SI,a
* * xor *BX,BX
* * mov BH,[aa+1]
* * xor * DX,DX
* * and *BX,BX
* * jz * *done
* * mov CL,4
nextdig:
* * lodsb
* * cmp AL,'0'
* * jc * * error
* * cmp '9',AL
* * jnc * process
* * and *AL,0DFh
* * cmp AL,'A'
* * jc * * error
* * cmp 'F',AL
* * jc * * error
* * sub *AL,7
process:
* * sub AL,'0'
* * shl *DX,CL
* * add DX,AX
* * dec BX
* * jnz nextdig
done:
// закончили. число в DX
...
error:
//обработчик ошибки
:)
Исправлено: shurikan, 4:33 20-11-2003
Исправлено: shurikan, 4:36 20-11-2003
Подскажите плиз: Есть у меня число в регистре AX (к примеру 80B2), как вывести это число на экран именно в таком же виде, т.е число 80B2.
shurikan
21-11-2003, 03:44
MER
.data
string *db 10 dup (?)
.code
* ...
* mov *cx,@data
* mov *es,cx
* lea *di,string
* mov *bx,ax
* mov *cx,4
next:
* push cx
* xor *ax,ax
* mov *cx,4
@@1:
* shl *bx,1
* rol *ax,1
* loop @@1
* pop *cx
* add *ax,'0'
* cmp *'9' ,ax
* jnc *cont
* add *ax,7
cont:
* stosb
* loop next
* xor *ax,ax ;;; mov *ax,'$'
* stosb
done:
* ...
:)
Исправлено: shurikan, 5:38 21-11-2003
Andreich
21-11-2003, 04:06
вот полный код проги(com) выводяшей сканкод клавиши
.286
cseg segment
assume cs:cseg, ds:cseg, ss:cseg, es:cseg
org 100h
begin:
mov ah,10h
int 16h
cmp al,27
je _begin_quit
mov dh,ah
mov dl,al
MOV ax,0
mov al,dh
mov bl,10h
div bl
mov n1,al
mov n2,ah
MOV ax,0
mov al,dl
mov bl,10h
div bl
mov n3,al
mov n4,ah
call _n1
call _n2
call _n3
call _n4
add n1,30h
add n2,30h
add n3,30h
add n4,30h
mov ah,9
mov dx,offset n1
int 21h
JMP BEGIN
_begin_quit:
int 20h
;---procedures---
_n1proc near
cmp n1,9
jbe q1
add n1,7
q1:
ret
_n1endp
_n2proc near
cmp n2,9
jbe q2
add n2,7
q2:
ret
_n2endp
_n3proc near
cmp n3,9
jbe q3
add n3,7
q3:
ret
_n3endp
_n4proc near
cmp n4,9
jbe q4
add n4,7
q4:
ret
_n4endp
;---data---
n1 db 0
n2 db 0
n3 db 0
n4 db 0
k db ' $'
cseg ends
end begin
код цифр на 30h больше их значенния
код букв(A..F) больше их значения на 37h
Исправлено: Andreich, 22:43 21-11-2003
Andreich
Большое спасибо, но это что за переменные n1, n2, n3, n4. Где их и как описать?
Добавлено:
shurikan
Спасибо, Все работает, наПочему-то на экран ничего не выводит, почему?
shurikan
21-11-2003, 15:45
MER
А там и нет функции вывода. Я думал ты сам сможешь отобразить строку на экране. А в коде я специально комментарий поставил. Это там, где последним символом строки заносится 0h или '$'. *Ты же сам писал:
* * lea * * * DX,mes1
* * mov * * * AH,09h
* * int * * * 21h
Если пользуешься ею, то заканчивай строу "долларом". Вместо mes1 поставь адрес буфера (здесь - string)
:)
Andreich
21-11-2003, 21:45
MER см выше
Andreich
Все круто, но последние две цифры всегда 1 и 0, независимо от того какое число я ввожу!
Добавлено:
shurikan
Незнаю почему, но выводит так: 7777 (не зависимо от того какое число я ввожу)
Andreich
23-11-2003, 21:10
блин, народ, весь инет перекопал, а вот как сделать генератор СЧ - не нашел:( помогите кто знает
shurikan
23-11-2003, 22:31
MER
Прости зас.....ца!!!:shuffle:
Ошибся! После метки @@1 вторая команда д.б. не rol, а rcl. Говорят же: "Поспешай, не торопясь".
Ищу исходники к таким прогам:
1. Дано 4-х-значное число. Найти сумму цифр.
2. Напечатать в одну строку все литеры с 'А' по 'Z'.
Andreich
29-11-2003, 16:28
1.
mov ax,1235 ;заносим в АХ наше число
xor dx,dx
mov bx,100 ;если оно десятичное то делим на 100, если 16ричное то делим на 100h
div bx
mov bl,10 ;10 или 10h
div bl
mov cl,al
add cl,ah
mov ax,dx
div bl
add cl,al
add cl,ah жтеперь в CL сумма цифр(в любом случае в 16ричной системе счисления
2.
cseg segment
assume cs:cseg
org 100h
begin:
mov ah,2
mov dl,40h
mov cx,26
re:
inc dl
int 21h
loop re
int 20h
cseg ends
end begin
Исправлено: Andreich, 22:16 30-11-2003
shurikan
30-11-2003, 18:42
MER
Ты сам придумываешь, или вам задания дают? Странные они какие-то. Обычно задача ставится и решается в общем виде. Например, почему именно 4-значное число? В какой системе счисления? А если у меня больше или меньше знаков в числе? А если число отрицательное, но все же 4-значное?
Для того, чтобы такие задачки решать, необходимо представить себе, что ты сам бы делал с числом, строкой или любым другим объектом.
Вот твое 4-значное число. Как найти его сумму цифр? *Надо иметь аккумулятор, где будет накапливаться сумма цифр. Поначалу в нем, естественно, 0.
Задано 4 знака - значит нам нужно 4 одинаковых действия, помещенные в цикл. Что за действия?
1. Найти остаток от деления числа на 10. Это очередное слагаемое. (пример: 2587 % 10 -> 7)
2. Разделить нацело число на 10. Т.е. отбросить последнюю цифру. (пример: 2587 / 10 -> 258)
3. Добавить остаток из пункта 1 к аккумулятору.
4. Если не все обработано, вернуться к п.1, иначе к п.5
5. Все. Сумма найдена.
Осталось только написать код. Не важно на каком языке.
А вот последовательность букв от 'A' до 'Z'. Во всех современных кодировках, гарантируется, что буквы следуют в алфавитном порядке. А как хранит буквы компьютер? Каждый символ - это 1 байт (если кодировка не UNICODE). Пусть в байте содержится значение 41h (шестнадцатиричное). Как его интерпретировать, зависит от программиста. Это м.б. просто число. Но... Если ты попросишь систему вывести на экран символ, код которого 41h, то выведется латинская буква 'A'. У буквы 'B' код больше на 1-цу. И т.д. Отсюда появляется идея алгоритма:
1. Всего букв 26
2. Первую выводим с кодом 41h
3. Увеличиваем код на 1.
4. Если не все 26 букв вывели, перейти на п.2, иначе на п.5
5. Закончили.
Ну и здесь осталось дело за написанием кода...
Попробуй сам! Интересно...:biggrin:
Добавлено:
Andreich
Осторожно!!! Это опасный код:
Цитата:
mov bl,100 ;если число десятичное то делим на 100 если в 16-ричной системе то делим на 100h
div bl
Если работать в шестнадцатиричной системе, то первая команда зашлет 0 в bl, а вторая - произведет деление на 0.
Исправлено: shurikan, 18:52 30-11-2003
Исправлено: shurikan, 18:54 30-11-2003
Andreich
30-11-2003, 22:36
shurikan
Упс:shuffle: Спасибо вроде исправился.не суди строго - я асм изучаю(если можно так сказать) не больше месяца и то когда время есть
:oszone: Можно ли общаться с СОМ1 портом ПК в операционной системе WindowsXP с помощью Ассемблера!
Исправлено: OLIMJON, 17:33 2-01-2004
Темы лучше не дублировать...
Исправлено: Prisoner, 1:10 3-01-2004
shurikan
03-01-2004, 04:33
OLIMJON
Можно. Нужно описать интерфейс функций API CreateFile, WriteFile, ReadFile и CloseHandle. Этих четырех вполне хватит для работы с COM-портом. Под C или Pascal-ем это не проблема. А для болеее полного ответа надо знать, каким ассемблером ты пользуешься.
:)
nujen a86 kod perevesti malenkie bukvi v bolshie.
UpCase PROC NEAR
PUSH AX
SUB AL,32 ; substruct 32 to get upper case latter
POP AX
RET
UpCase ENDP
ne mogu ponyt' pochemu ne rabotaet algoritm
shurikan
15-01-2004, 04:18
Guest
Этот код по своей идее должен преобразовывать строчные латинские буквы в прописные. Должен, но ты сначала заталкиваешь AX в стек, потом вычитаешь 32 из младшей половины AX (т.е. из AL), а затем извлекаешь из стека старое значение. Получается с чем вошел, с тем и вышел.
:)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC