Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2010, 13:48   #1
sig_GB
Пользователь
 
Регистрация: 23.02.2010
Сообщений: 69
По умолчанию Degree d^n, как организовать ввод\вывод?

Код:
;Программа возведения числа d в степень n>=1
;Вход: число и степень, в которую возводим
;Выход: результат возведения в степень числа
;===========================================
data segment para public "data"
degree dw 1
d dw ?
n dw ?
message1 db "Please, write d and n...,$"
message2 db "Degree d^n = ... ",'$'
data ends
stk segment stack
[13]    db 400 duo ("?")
stk ends
code segment para public "code"
start:
     assume cs:code,ds:data,ss:stk
     mov ax,data
     mov ds,ax ;инициализация сегментного регистра DS
     
     mov ah,9  ;ввод данных
     mov dx,offset message1
     int 21h   
     xor ax,ax
     mov ah,1h
     int 21h
     mov dl,al
[28]mov d,al
[29]mov n,dl
          
     mov cx,n ;степеь числа n в регистр cx
     xor ax,ax
cycl:   
     jcxz exit
     mov ax,degree
     mul d
     mov degree,ax
     dec cx
     jmp cycl
exit:
     mov ah,9  ;вывод данных
     mov dx,offset message2
     int 21h   
     mov ax,4c00h
     int 21h
code ends
end start
программа рабочая, а как решил организовать мало-мальский ввод\вывод - пишет ошибки: 13-value out of range\\ 28-29-operand types do not match.
В начале описано, что подаётся на ввод и вывод.
В книге искал, искал, нашёл только вывод на порты.(Юров В.И. 2-е изд.)
Приведите кусок программы [;ввод данных] на ввод пожалуйста. (& вывод результата degree)
Помог? Нажми на <Весы> слева.
С++, Pascal, Assembler 386 - под заказ.

Последний раз редактировалось sig_GB; 03.04.2010 в 13:51. Причина: расставил строки
sig_GB вне форума Ответить с цитированием
Старый 03.04.2010, 14:19   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

13 - что еще за duo? Может все-таки dup.
28, 29 - у вас переменные dword, а вы суете в них половину регистра... Посмотрите в сторону ptr.

Про вывод:
Вы под что пишите? Скорее всего под вин.. какую? Хотя код похож на 16-битный.
Под ДОС можно прерывания использовать, а под вин - винАПИ.
p51x вне форума Ответить с цитированием
Старый 03.04.2010, 15:30   #3
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

удалено...
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 03.04.2010, 18:51   #4
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

p51x, тут виндою и не пахнет, т.к. автор темы явно пишет эту прогу под DOS.
sig_GB, в интернете примеров огромная куча. Набросал для вас пример с вводом/выводом. Правда программа для маленьких чисел. Для сильно больших не охота заморачиваться, да и не нужно вам это пока. Если что то не понятно - пишите в топик.
Код:
.model tiny
.code
org 100h
.386
start:
;перходим в 3-ий режим и чистим экран
     mov ax,3
     int 10h
     mov dx,offset mes1
     mov ah,9
     int 21h 

     mov dx,offset buffer
     mov ah,0Ah
     int 21h 

     mov dx,offset crlf
     mov ah,9
     int 21h ; перевод строки

     xor di,di 
     mov ax,0h
     mov cl,blength
     xor ch,ch
     xor bx,bx
     mov si,cx 
     mov cl,10 
asc2hex:
     mov bl,byte ptr bcontents[di]
     sub bl,'0' 
     mul cx 
     add ax,bx 
     inc di 
     cmp di,si 
     jb asc2hex 
     push ax
     mov dx,offset mes2
     mov ah,9
     int 21h 


     mov dx,offset buffer
     mov ah,0Ah
     int 21h
     mov dx,offset crlf
     mov ah,9
     int 21h 

     xor di,di 
     mov ax,0h
     mov cl,blength
     xor ch,ch
     xor bx,bx
     mov si,cx 
     mov cl,10 
asc2hex2:
     mov bl,byte ptr bcontents[di]
     sub bl,'0' 
     mul cx 
     add ax,bx 
     inc di 
     cmp di,si 
     jb asc2hex2 
     mov bx,ax
     mov dx,offset mes3
     mov ah,9
     int 21h

     pop ax
     
     mov cx,ax
     mov ax,bx
     mov bx,ax
     dec cx

l1:    
    imul ax,bx            
    loop l1


     mov bx,10
     xor di,di
l2:
     xor dx,dx
     div bx
     add dl,030h
     dec di
     mov buf_end[di],dl
     cmp ax,00h
     jnz l2
     lea dx,buf_end[di]
     mov ah,09h
     int 21h
e1:
     mov ah, 0
     int 16h
exit: int 20
     ret

buf db 16 dup (?)
buf_end db'$'

mes1 db "Vvedite stepen: $"
mes2 db "Vvedite  chislo: $"
mes3 db "result: $"
crlf db 0Dh,0Ah,'$'
buffer db 6 ; максимальный размер буфера ввода
blength db ? ; размер буфера после считывания
bcontents: ; содержимое буфера располагается за концом СОМ-файла
a dw 0
b dw 0
end start
xor eax, eax
xchg [eax], eax

Последний раз редактировалось MalCer; 03.04.2010 в 18:56.
MalCer вне форума Ответить с цитированием
Старый 04.04.2010, 15:29   #5
sig_GB
Пользователь
 
Регистрация: 23.02.2010
Сообщений: 69
По умолчанию

скомпилировал com-файлик - жееесть. видать я ещё не дошёл до этого.
не хотел рыскать по регистрам искать результат, а вывести на экран. но чтобы в 20 строк -хотя это ж асм.
вообщем, ушел читать.
=============================
прикрепите кто-нибудь файл(картинка, текст) с кодами и функциями (аля mov ax,9 или mov ax,040ffh или int 21h или int20h - гугл молчит) и их назначением. а то не понятно, когда int 21h для вывода на экран, а когда для окончания. В книге Юрова нет.
Помог? Нажми на <Весы> слева.
С++, Pascal, Assembler 386 - под заказ.
sig_GB вне форума Ответить с цитированием
Старый 04.04.2010, 18:43   #6
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

sig_GB, гугл молчать не может. Все есть в интернете!!!
Цитата:
(аля mov ax,9 или mov ax,040ffh или int 21h или int20h
Правильно говорить, к примеру, функция 9, прерывания 21h - это вывод на экран. int20h - это выход в ДОС программах и тд.
Прилагаю справочники во вложении, не полные, но для начала сгодятся.
Одной книгой не отделаетесь - читайте книги параллельно. Порой нужно прочитать десяток, чтобы найти единственную, в которой поймешь что-то.
Удачи!
Вложения
Тип файла: zip Справочник .zip (136.8 Кб, 14 просмотров)
Тип файла: zip Справочник по ф-ям DOS и BIOS.zip (41.7 Кб, 14 просмотров)
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 04.04.2010, 23:46   #7
sig_GB
Пользователь
 
Регистрация: 23.02.2010
Сообщений: 69
По умолчанию

спасибо за советы. учту.
файлы скачал.
Помог? Нажми на <Весы> слева.
С++, Pascal, Assembler 386 - под заказ.
sig_GB вне форума Ответить с цитированием
Старый 18.04.2010, 15:25   #8
sig_GB
Пользователь
 
Регистрация: 23.02.2010
Сообщений: 69
По умолчанию

MalCer, (или кто-нибудь) объясните пожалуйста, что делает этот кусок:
Цитата:
xor di,di
mov ax,0h
mov cl,blength
xor ch,ch
xor bx,bx
mov si,cx
mov cl,10
А то при попытке использование Вашего ввода\вывода в другой программе, мне выкидывает ошибку
CS unreachable from current segment.
=================================== ================
Ткините пальцем, что не так?
Код:
18					 ;Данные для работы
     19	    0048  3D 3D	3D 3D 3D 3D 3D+	 mes0 db "=========== Матрица 7х5 ===========",'$',0Ah,0Dh
     20		  3D 3D	3D 3D 20 CC E0+
     21		  F2 F0	E8 F6 E0 20 37+
     22		  F5 35	20 3D 3D 3D 3D+
     23		  3D 3D	3D 3D 3D 3D 3D+
     24		  24 0A	0D
     25	    006E  50 6C	65 61 73 65 2C+	 mes1 db "Please, write	number of stripe: $"
     26		  20 77	72 69 74 65 20+
     27		  6E 75	6D 62 65 72 20+
     28		  6F 66	20 73 74 72 69+
     29		  70 65	3A 20 24
     30	    008F  52 65	73 75 6C 74 3A+	 mes2 db "Result: $"
     31		  20 24
     32	    0098  0D 0A	24		 crlf db 0Dh,0Ah,'$'
     33		  =0002			 size_elem=2
     34	    009B  0000			 Sum dw	0
     35	    009D  10*(??)		 buf db	16 dup (?)
     36	    00AD  24			 buf_end db '$'
     37	    00AE  06			 buffer	db 6 ; максимальный размер буфера ввода
     38	    00AF  ??			 blength db ? ;	размер буфера после считывания
     39	    00B0			 bcontents: ; содержимое буфера
**Error** lab5.asm(24) CS unreachable from current segment
     40	    00B0  0000			 a dw 0
     41	    00B2  0000			 b dw 0
     42	    0000			 stack 256h
     43	    00B4			 .code
     44					 .386
Помог? Нажми на <Весы> слева.
С++, Pascal, Assembler 386 - под заказ.

Последний раз редактировалось sig_GB; 18.04.2010 в 15:49.
sig_GB вне форума Ответить с цитированием
Старый 18.04.2010, 20:45   #9
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Код:
;перевод числа в ASCII-формате из буфера в бинарное число в АХ, как то так
xor di,di ; DI = 0 - номер байта в буфере
mov ах,0h ; АХ = 0 - текущее значение результата
mov cl,blength
xor ch,ch  ; тут понятно ch=0
xor bx,bx  ; bx=0
mov si,cx ; SI - длина буфера
mov cl,10 ; CL = 10, множитель для MUL
Цитата:
CS unreachable from current segment
Название говорит само за себя: CS недоступен из текущего сегмента
Цитата:
Ткините пальцем, что не так?
У тебя метка bcontents: ; содержимое буфера находится в сегменте данных

Могу предложить еще процедурки для ввода/вывода
http://forum.vingrad.ru/faq/topic-15...%BB%D0%B0.html
--
хмм...перешел по ссылке работает через раз. Вот еще один вариант http://www.cyberforum.ru/assembler/thread54461.html
xor eax, eax
xchg [eax], eax

Последний раз редактировалось MalCer; 18.04.2010 в 21:15.
MalCer вне форума Ответить с цитированием
Старый 18.04.2010, 23:43   #10
sig_GB
Пользователь
 
Регистрация: 23.02.2010
Сообщений: 69
По умолчанию

Тоесть, а если эту строчку заменить как-то?
Цитата:
bcontents: ; содержимое буфера
a dw 0
b dw 0
=====
mov bl,byte ptr bcontents[di]
...
заменить на (там же а-для первого случая, b-для второго, наверно)
Цитата:
a dw 0
=====
mov bl,a
...
Я не прав?
Помог? Нажми на <Весы> слева.
С++, Pascal, Assembler 386 - под заказ.
sig_GB вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как организовать ввод строки с пробелами? Adminx Общие вопросы C/C++ 11 20.11.2009 02:33
Как в C++ организовать ввод данных в одну строчку? amdbodia Общие вопросы C/C++ 10 16.05.2009 18:03
Как осуществить ввод данных в одном цикле, их обработку в другом, и вывод результатов в третьем? ReM Паскаль, Turbo Pascal, PascalABC.NET 5 11.11.2008 18:21
Как организовать вывод сообщений программой в VCL режиме Delphi? Evgenii Помощь студентам 10 28.07.2008 11:28
Организовать ввод данных с файла созданного в первом задании и вывод их терминал. Saniok Помощь студентам 2 25.10.2007 22:25