Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Процедура стандартного ввода-вывода...  (Прочитано 8468 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Lazar
Гость
« : 12-05-2007 06:12 » 

Здравствуйте, уважаемые эксперты. Появилась новая проблема. Есть своеобразная задачка в Linux. Ввожу данные со стандартного ввода посредством двух процедур input_first_value и input_second_value в buffer1 и buffer2 соответственно. Можно ли сделать общую процедуру ввода данных в разные buffer'ы?
И каким образом?

Общая задача у меня такова: ввести два десятичных числа, преобразовать их в двоичные, сложить и вывести на экран...

GLOBAL _start
SEGMENT .txt
_start:
;------------------------------------------
call output_titl1

call input_first_value

call output_titl3

call output_first_value
;------------------------------------------
call output_titl2

call input_second_value

call output_titl4

call output_second_value

call output_result
;------------------------------------------
input_first_value:
mov eax,3
mov ebx,0
mov ecx,buffer1
mov edx,20
int 80h
ret

input_second_value:
mov eax,3
mov ebx,0
mov ecx,buffer2
mov edx,20
int 80h
ret

output_first_value:
mov eax,4
mov ebx,1
mov ecx,buffer1
mov edx,20
int 80h
ret

output_second_value:
mov eax,4
mov ebx,1
mov ecx,buffer2
mov edx,20
int 80h
ret

output_titl1:
mov eax,4
mov ebx,1
mov ecx,titl1
mov edx,24
int 80h
ret

output_titl2:
mov eax,4
mov ebx,1
mov ecx,titl2
mov edx,26
int 80h
ret

output_titl3:
mov eax,4
mov ebx,1
mov ecx,titl3
mov edx,30
int 80h
ret

output_titl4:
mov eax,4
mov ebx,1
mov ecx,titl4
mov edx,31
int 80h
ret

output_result:
mov eax,1234567890
mov esi,10
mov ecx,0
pov:
mov edx,0
div esi
add dl,'0'
push edx
inc ecx
cmp eax,0
jne pov
mov [cnt],ecx
izv:
pop edx
mov [digit],dl
mov eax,4
mov edx,1
mov ecx,digit
mov edx,1
int 80h
dec dword [cnt]
cmp dword [cnt],0
jne izv
mov eax,1
int 80h
ret

SEGMENT .data
digit db 0
cnt dd 0
titl1 db 'Enter the first value:',13,10
titl2 db 'Enter the second value: ',13,10
titl3 db 'Buffer control. First value:',13,10
titl4 db 'Buffer control. Second value:',13,10
buffer1 times 20 db 0
buffer2 times 20 db 0
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 12-05-2007 09:30 » 

Lazar, тебе нужно написать ф-ии преобразования строки в число и наоборот.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 12-05-2007 10:46 » 

Lazar,

>> ввести два десятичных числа, преобразовать их в двоичные, сложить и вывести на экран...

алгоритм такой (очень простой Улыбаюсь ) -
пусть 4-байтное число надо представить в двоичном виде в строке
( 123 -> 00000000000000000000000001111011 )


то есть наша строка будет максимум 32+1(z) == 33 байта
#define bitsnum 32
#define strlen (bitsnum+1)

str[strlen]={0};

алгоритм

обязательно обнулить строку str;

str[strlen-1]='$';

BYTE currIndx=bitsnum;
DWORD dwd = некое число;


for( ;; )
{
  currIndx--;

  dwd= dwd >> 1

  if(перенос)
  {
    str[currIndx]='1';
  }

  if(!currIndx)break;
}

;str содержит число в двоичном виде

« Последнее редактирование: 12-05-2007 10:49 от Алексей1153++ » Записан

Lazar
Гость
« Ответ #3 : 12-05-2007 13:48 » 

Алексей, эт ж С! На С многих проблем я б избежал, ибо люблю этот язык "несколько" больше чем Ассемблер...
А как сия прога на Ассемблере выглядеть будет...

Алексей, в личку отписал, на всякий случай и сюда.
Тут возник такой вопрос. Написал проверку на ввод значения с клавиатуры. Если введеный символ - буква, а не число, прога выдает ошибку. Но у меня получилось сделать лишь так, чтобы проверялся первый разряд многоразрядного значения. Как загнать проверку в цикл, чтобы прога проверяла все разряды введенного числа?

GLOBAL _start
SEGMENT .text
_start:

mov eax,3
mov ebx,0
mov ecx,buffer1
mov edx,4
int 80h

mov eax,buffer1
mov ecx,counter

cmp byte[eax],'0'
jl error
cmp byte[eax],'9'
jg error
cmp ecx,'0'
je end_programm

end_programm:
mov eax,1
int 80h

error:
mov eax,4
mov ebx,1
mov ecx,txt
mov edx,25
int 80h
jmp end_programm

SEGMENT .data
txt db '...Incorrected value...',13,10
buffer1 dd 0
counter db 4
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 12-05-2007 14:18 » 

Lazar,
>> эт ж С

я же не зря так коряво разместил команды в коде си ) Специально для переноса в ассемблер. А программу написать я щас навскидку не смогу, это тебе предоставлено )


>> Как загнать проверку в цикл, чтобы прога проверяла все разряды введенного числа?

участок кода
Код:
cmp byte[eax],'0'
jl error
cmp byte[eax],'9'
jg error

нужно переделать - заключить его в ещё один цикл, в котором менять значение регистра eax от (0) до ((количество символов в введённой строке)-1)
« Последнее редактирование: 12-05-2007 14:20 от Алексей1153++ » Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines