PDA

Показать полную графическую версию : Assembler


Страниц : 1 [2]

shurikan
15-11-2003, 01:52
MER

mov *ah,10h
int *16h
...
mov *ax,4C00
int *21h
Вот так и считываем нажатие и код клавиши... А пока ждём нажатия, прога, естественно, стоит... И экран сохраняется


Исправлено: shurikan, 5:57 18-11-2003

BRAT2
15-11-2003, 12:19
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

BRAT2
20-11-2003, 21:16
Подскажите плиз: Есть у меня число в регистре 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

BRAT2
21-11-2003, 13:52
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 см выше

BRAT2
23-11-2003, 12:30
Andreich

Все круто, но последние две цифры всегда 1 и 0, независимо от того какое число я ввожу!

Добавлено:

shurikan

Незнаю почему, но выводит так: 7777 (не зависимо от того какое число я ввожу)

Andreich
23-11-2003, 21:10
блин, народ, весь инет перекопал, а вот как сделать генератор СЧ - не нашел:( помогите кто знает

shurikan
23-11-2003, 22:31
MER
Прости зас.....ца!!!:shuffle:
Ошибся! После метки @@1 вторая команда д.б. не rol, а rcl. Говорят же: "Поспешай, не торопясь".

BRAT2
29-11-2003, 12:13
Ищу исходники к таким прогам:
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: Спасибо вроде исправился.не суди строго - я асм изучаю(если можно так сказать) не больше месяца и то когда время есть

OLIMJON
02-01-2004, 17:18
: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-ем это не проблема. А для болеее полного ответа надо знать, каким ассемблером ты пользуешься.
:)

Guest
12-01-2004, 23:39
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