Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Assembler (http://forum.oszone.net/showthread.php?t=30042)

BRAT2 28-10-2003 12:06 206865

У кого есть исходник к такой проге: 1)переводит число из шестнацатиричной  в десятиричную.
2) заполняет экран знаком $

shurikan 29-10-2003 05:19 206866

MER
Можно поконкретней?
1. Под какую ОС?
2. Приложение консольное или графическое?
3. Какой ассемблер?
:)

e80 30-10-2003 12:47 206867

MER на те код к второй проге:

на C
while (true) printf("$");

на Паскале
While true do write('$');

:)

shurikan 30-10-2003 16:23 206868

e80
Смешно. Только без Ctrl+C не обойтись. Да и вопрос был про ассемблер. :gigi:

e80 30-10-2003 16:52 206869

shurikan, сори про АСМ не заметил :(
но там будет чето в духе

mov cx, 4000   ;счетчик (4000 символов вывести)
lab1:
mov dl, 20h    ;наш символ
mov ah, 2h     ; функц. вывод на екран символа
int 21h           ; int 21h он и в африке 21h
loop lab1        ; цикл

где 20h - заменяеш на код "$"
:) :) :)

shurikan 30-10-2003 17:28 206870

e80
Под DOS-ом прокатит, да и то сначала надо экран очистить и стартовать с левого верхнего угла. А под win- или nix? Потому и спрашивал, чего так сразу код писать? :)

e80 30-10-2003 17:37 206871

shurikan, вериш, впадло просто асм вспоминать, уже года 3-4 не програмил
а ты вот комментируеш тут, я конечно понимаю - критика правильная, но тем не менее
кинул бы пару примеров под дос вин *nix
(а код мой ейсли 4000 изменить на 32000 не требует очистки екрана и всего остального :) )

shurikan 31-10-2003 13:05 206872

e80, прости, я не критикую. Я просто говорю, что в этих осях вывод организован по разному, по-этому я и задавал *
MER-у вопросы. Кстати, тебе не кажется, что мы развели с тобой двустороннюю дискуссию, а "Германна все нет"?
:) *:beer::beer::beer:

BRAT2 31-10-2003 15:45 206873

Я слышал, есть такая прога которая из паскалевских файлов *.pas делает файлы *.asm. Это правда? Если есть такая прога, то скажите где ее можно взять.

e80 31-10-2003 17:49 206874

MER
Паскалевскую прогу компилируеш,
потом дизасемблируеш :)
а напрямую не слышал :(

BRAT2 03-11-2003 21:00 206875

Дайте, кто знает, ссылку на какой-нибудь сайт, с которого можно было бы скачать кучу исходников по Ассемблеру.

Prisoner 04-11-2003 01:15 206876

MER
У меня предложение :). Какое? А вот какое - поисковые системы. Скажем по яндексу на запрос ассемблер исходники можно было в пятой строке найти такое - http://lib.k6.ru/a/Assembler/stat.php . Дальше не проверял, но уверен, что похожей информации там не мало. Желаю удачи.

Tr00per 06-11-2003 09:10 206877

Куча статей и исходников по ассемблеру - www.wasm.ru

Andreich 09-11-2003 01:06 206878

Во блин, нарыл!!!
MER
Цитата:

Я слышал, есть такая прога которая из паскалевских файлов *.pas делает файлы *.asm. Это правда? Если есть такая прога, то скажите где ее можно взять.
Это чудо Pascal Pro завется.
http://www.fortunecity.com/skyscraper/sql/39/
http://pascal.times.lv/dl/compilers.htm

Zar 09-11-2003 19:03 206879

Pod Linux mozhno C v ASM perefigachit':

gcc -s proga.c

kod na asm:    proga.s

:cranky:


BRAT2 09-11-2003 20:16 206880

Andreich

Как все-таки эта прога работает (я понял что через командную строку)?

Andreich 10-11-2003 23:05 206881

b]MER[/b]
Цитата:

я понял что через командную строку
Угу:gigi:

BRAT2 12-11-2003 22:40 206882

e80

за это

mov cx, 4000   ;счетчик (4000 символов вывести)
lab1:
mov dl, 20h    ;наш символ
mov ah, 2h     ; функц. вывод на екран символа
int 21h           ; int 21h он и в африке 21h
loop lab1        ; цикл

спасибо, но как сделать так чтобы окно при этом не исчезало, а оставалось открытым с полностью заполненным экраном?

e80 13-11-2003 11:49 206883

MER, в конце делаеш вызов функции считывания символа с клавы - и все. (листинг позже)
А чтоб окно не закрывало, запускай из консоли
(command.com - в 98, cmd - в 2000)

BRAT2 13-11-2003 19:09 206884

e80

в конце делаеш вызов функции считывания символа с клавы - че это за функция, такую не знаю, подскажи?

shurikan 15-11-2003 01:52 206885

MER
Код:


mov *ah,10h
int *16h
...
mov *ax,4C00
int *21h

Вот так и считываем нажатие и код клавиши... А пока ждём нажатия, прога, естественно, стоит... И экран сохраняется


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

BRAT2 15-11-2003 12:19 206886

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 206887

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:
//обработчик ошибки

:)


[s]Исправлено: shurikan, 4:33 20-11-2003[/s]


[s]Исправлено: shurikan, 4:36 20-11-2003[/s]

BRAT2 20-11-2003 21:16 206888

Подскажите плиз: Есть у меня число в регистре AX (к примеру  80B2), как вывести это число на экран именно в таком же виде, т.е число 80B2.

shurikan 21-11-2003 03:44 206889

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:
 * ...

:)


[s]Исправлено: shurikan, 5:38 21-11-2003[/s]

Andreich 21-11-2003 04:06 206890

вот полный код проги(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


[s]Исправлено: Andreich, 22:43 21-11-2003[/s]

BRAT2 21-11-2003 13:52 206891


Andreich

Большое спасибо, но это что за переменные n1, n2, n3, n4. Где их и как описать?

Добавлено:

shurikan

Спасибо, Все работает, наПочему-то на экран ничего не выводит, почему?

shurikan 21-11-2003 15:45 206892

MER
А там и нет функции вывода. Я думал ты сам сможешь отобразить строку на экране. А в коде я специально комментарий поставил. Это там, где последним символом строки заносится 0h или '$'. *Ты же сам писал:
Цитата:

* * lea * * * DX,mes1
* * mov * * * AH,09h
* * int * * * 21h
Если пользуешься ею, то заканчивай строу "долларом". Вместо mes1 поставь адрес буфера (здесь - string)
:)

Andreich 21-11-2003 21:45 206893

MER см выше

BRAT2 23-11-2003 12:30 206894

Andreich

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

Добавлено:

shurikan

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

Andreich 23-11-2003 21:10 206895

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

shurikan 23-11-2003 22:31 206896

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

BRAT2 29-11-2003 12:13 206897

Ищу исходники к таким прогам:
1. Дано 4-х-значное число. Найти сумму цифр.
2. Напечатать в одну строку все литеры с 'А' по 'Z'.

Andreich 29-11-2003 16:28 206898

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


[s]Исправлено: Andreich, 22:16 30-11-2003[/s]

shurikan 30-11-2003 18:42 206899

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.


[s]Исправлено: shurikan, 18:52 30-11-2003[/s]


[s]Исправлено: shurikan, 18:54 30-11-2003[/s]

Andreich 30-11-2003 22:36 206900

shurikan
Упс:shuffle: Спасибо вроде исправился.не суди строго - я асм изучаю(если можно так сказать) не больше месяца и то когда время есть

OLIMJON 02-01-2004 17:18 206901

:oszone: Можно ли общаться с СОМ1 портом ПК в операционной системе WindowsXP с помощью Ассемблера!


[s]Исправлено: OLIMJON, 17:33 2-01-2004[/s]

Темы лучше не дублировать...


[s]Исправлено: Prisoner, 1:10 3-01-2004[/s]

shurikan 03-01-2004 04:33 206902

OLIMJON
Можно. Нужно описать интерфейс функций API CreateFile, WriteFile, ReadFile и CloseHandle. Этих четырех вполне хватит для работы с COM-портом. Под C или Pascal-ем это не проблема. А для болеее полного ответа надо знать, каким ассемблером ты пользуешься.
:)

Guest 12-01-2004 23:39 206903

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 206904

Guest
Этот код по своей идее должен преобразовывать строчные латинские буквы в прописные. Должен, но ты сначала заталкиваешь AX в стек, потом вычитаешь 32 из младшей половины AX (т.е. из AL), а затем извлекаешь из стека старое значение. Получается с чем вошел, с тем и вышел.
:)


Время: 11:28.

Время: 11:28.
© OSzone.net 2001-