19.09.2018, 17:00 [+3 UTC]
в нашей команде: 2 970 чел. | участники онлайн: 5 (рекорд: 21)

:: РЕГИСТРАЦИЯ

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.50 (13.09.2018)

Общие новости:
13.04.2018, 10:33

Форум:
18.09.2018, 08:51

Последний вопрос:
19.09.2018, 12:40

Последний ответ:
19.09.2018, 08:03

Последняя рассылка:
18.09.2018, 17:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
24.01.2010, 04:07 »
Спиридонов Данил Сергеевич
Спаисибо, помогло. [вопрос № 176199, ответ № 258815]
22.10.2009, 21:38 »
Яна
Большое спасибо за подробный оперативный ответ. [вопрос № 173576, ответ № 255726]

РАЗДЕЛ • Assembler

Создание программ на языке Assembler.

[администратор рассылки: Лысков Игорь Витальевич (Старший модератор)]

Лучшие эксперты в этом разделе

Зенченко Константин Николаевич
Статус: Модератор
Рейтинг: 178
Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 93
Kdsfofwe21
Статус: 1-й класс
Рейтинг: 51

Перейти к консультации №:
 

Консультация онлайн # 193474
Раздел: • Assembler
Автор вопроса: cupoma58 (Посетитель)
Отправлена: 16.08.2018, 11:42
Поступило ответов: 0

Здравствуйте! Прошу помощи в следующем вопросе:
Арифмометр для целых положительных чисел. С конвертацией, вроде-бы, разобрался, но результаты
работы арифмометра - не радуют: к результату сложения-вычитания добавляется "0", а к результату
умножения - "00".
Арифмометр здесь: fenix.asm, data.inc, const.inc

Подправил ссылки
--------

• Отредактировал: Лысков Игорь Витальевич (Старший модератор)
• Дата редактирования: 16.08.2018, 11:54

Состояние: Консультация закрыта

Oтветов пока не поступило.

Мини-форум консультации № 193474

cupoma58
Посетитель

ID: 401688

# 1

 +1 
 
= общий = | 16.08.2018, 11:44 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Вроде-бы - создал.
В ссылке опечатка: нужно "cupoma58.ru/assembler_04.html,.."

• Отредактировал: cupoma58 (Посетитель)
• Дата редактирования: 16.08.2018, 11:49

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 2

= общий = | 16.08.2018, 11:50 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
cupoma58:

Отлично smile
Повторю, что сказал ранее:

© Цитата: Лысков Игорь Витальевич
У Вас неправильно работает функция asc2bin, а именно, сначала умножается на 10, затем проверяется очередной символ на 0, а должно быть наоборот

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

Зенченко Константин Николаевич
Модератор

ID: 31795

# 3

 +1 
 
= общий = | 16.08.2018, 13:56 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Повторю И.В.

© Цитата: Лысков Игорь Витальевич
У Вас неправильно работает функция asc2bin, а именно, сначала умножается на 10, затем проверяется очередной символ на 0, а должно быть наоборот

smile

И добавлю совсем не правильно.
Код (Assembler) :: выделить код
asc2bin proc                  ;(((eax*10)+edx)*10+edx)*...
 	pushad
 . . .
cycl:
 . . .
	inc	esi                  ;к следующему символу
	jc	exit                 ;если CF=1
	jmp	cycl                 ;повторим
fin:
 . . .
	popad
exit:                     ;для возможной обработки CF
	ret
asc2bin endp

Тут две ошибки:
1) Если будете ждать пока ESI переполнится, то раньше ОСЬ сама выбросит критическую ошибку, т.к. Вы залезете командой mov dl,[ esi ], в системную область старших адресов.
2) Даже если ОСь пропустит это событие и ESI таки переполнится, то выход из п/пр-ммы будет происходить по значению одного из регистров РОН(они все ещё в стеке) smile .

Теперь алгоритм перевода ascii -> bin:
Есть всего 8-мь РОН:EAX,EBX,ECX,EDX,ESI,EDI EBP,ESP
Начинаем определятся с используемыми регистрами:
EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP - использоваь нельзя, они используются системой и п/пр-ммой;
EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP - использовать нельзя, т.к. используются в командах MUL и DIV;
EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP - ВЫ используете как указатель строки;
EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP Вы используете как основание системы счисления.
Остались ЕВХ и ЕСХ, я использовал ЕВХ:
Код (Assembler) :: выделить код
asc2bin proc                  ;(((eax*10)+edx)*10+edx)*...
 	pushad
 	xor	edx,edx                ;обнулимся...
	xor	eax,eax             
	mov	edi,10                 ;10 - основание системы счисления
	lea	esi,buf                ;адрес 1-го ASCII-символа
cycl:
	mov	bl,[esi]             ;выберем ASCII-символ
	or	bl,bl                ;нечего выбирать?
	jz	fin                  ;на выход 

	mul	edi                  ;edx:eax = eax*10  
	and	bl,0Fh               ;преобразуем ASCII-символ
	movzx	ebx,bl              ;расширяем
	add	eax,ebx              ;промежуточная сумма
	inc	esi                  ;к следующему символу
;
	or	edx,edx
	jz	cycl
	stc
;
;	jc	exit                 ;если CF=1
;	jmp	cycl                 ;повторим
fin:
	mov	bin,eax            ;сохраним дв.число
	popad
;	exit:                     ;для возможной обработки CF
	ret
asc2bin endp

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 4

= общий = | 20.08.2018, 11:51 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
cupoma58:

Ну что там с программой? Разобрались? Еще есть вопросы?

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

cupoma58
Посетитель

ID: 401688

# 5

= общий = | 22.08.2018, 15:09 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Здравствуйте. Благодарю за подсказку. С регистрами я разберусь. Просто - работаю по книжным примерам. А вопросы, по программе, остались. Я изменил порядок проверки очередного символа в процедуре asc2bin, как вы посоветовали. В работе арифмометра это ничего не изменило: к сумме и к разности по прежнему добавляется "0" --> 2+3=50, 8-6=20. А к произведению - сразу "00" --> 7*9=6300. С делением - всё в порядке. Подозреваю конвертацию, а в чём дело - не понимаю.
smile

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 6

= общий = | 22.08.2018, 15:16 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
cupoma58:

Я же говорил:

© Цитата: Лысков Игорь Витальевич
У Вас неправильно работает функция asc2bin, а именно, сначала умножается на 10, затем проверяется очередной символ на 0, а должно быть наоборот
В результате происходит лишнее умножение на 10. Покажите код функции asc2bin.

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

cupoma58
Посетитель

ID: 401688

# 7

= общий = | 22.08.2018, 15:18 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

cupoma58.ru/assembler_04.html

asc2bin proc                  ;(((eax*10)+edx)*10+edx)*...           
  pushad
  xor  edx,edx                ;обнулимся...
  xor  eax,eax             
  mov  edi,10                 ;10 - основание системы счисления
  lea  esi,buf                ;адрес 1-го ASCII-символа
  cycl:
    mov  dl,[esi]             ;выберем ASCII-символ <-- bl
    or   dl,dl                ;закончились символы?
    jz   fin                  ;завершаем преобразование
    mul  edi                  ;edx:eax = eax*10
    and  dl,0Fh               ;преобразуем ASCII-символ
    movzx dx,dl               ;расширяем...
    movzx edx,dx              ;...расширяем
    add  eax,edx              ;промежуточная сумма
    inc  esi                  ;к следующему символу <-- ecx
    jc   exit                 ;если CF=1
    jmp  cycl                 ;повторим
    fin:
      mov  bin,eax            ;сохраним дв.число
      popad
    exit:                     ;для возможной обработки CF
      ret
asc2bin endp

• Отредактировал: cupoma58 (Посетитель)
• Дата редактирования: 22.08.2018, 15:35

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 8

= общий = | 22.08.2018, 15:58 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
cupoma58:

Ну так, ничего ж не сделали... Вам же К.Н. предложил сделать так:

Код (Assembler) :: выделить код
asc2bin proc                  ;(((eax*10)+ebx)*10+ebx)*...           
  pushad
  xor  ebx,ebx                ;обнулимся...
  xor  eax,eax             
  mov  edi,ten                ;10 - основание системы счисления
  lea  esi,buf                ;адрес 1-го ASCII-символа
  cycl:
    mov bl, [esi]              ;выберем ASCII-символ
    inc esi
    or   bl,bl                ;нечего выбирать?
    jz   fin                  ;на выход (кроме того С будет равен 0)
    mul  edi                  ;edx:eax = eax*10   
    and  bl,0Fh               ;преобразуем ASCII-символ
    add  eax,ebx              ;промежуточная сумма
   or   edx,edx 		   ;проверка на переполнение DWORD-а
   jz   cycl
   stc 
    fin:
      mov  bin,eax            ;сохраним дв.число
      popad
      ret
asc2bin endp

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

cupoma58
Посетитель

ID: 401688

# 9

= общий = | 22.08.2018, 16:13 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Почему EDX ? Он, вроде-бы, нигде не фигурирует:

© Цитата: Лысков Игорь Витальевич
or edx,edx ;проверка на переполнение DWORD-а

Ещё раз - благодарю за подсказку. Буду пробовать, дома. Я в интернет выхожу из читального зала городской библиотеки, когда он там есть.

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 10

 +1 
 
= общий = | 22.08.2018, 16:27 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
cupoma58:

© Цитата:
Почему EDX ? Он, вроде-бы, нигде не фигурирует
Результат EAX*EDI будет в паре регистров EDX:EAX
Т.о., если EDX не 0, то получаем переполнение двойного слова. Флаг С взведется только, если переполнится EDX:EAX smile
По причине использования регистра EDX в операции умножения, в нем нельзя хранить очередную цифру. Поэтому выбран EBX
При использовании регистра EDX, как хранителя цифры, получался в результате 0, т.к. регистр EDX после умножения обнулялся.

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

• Отредактировал: Лысков Игорь Витальевич (Старший модератор)
• Дата редактирования: 22.08.2018, 16:31

cupoma58
Посетитель

ID: 401688

# 11

 +1 
 
= общий = | 28.08.2018, 11:06 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

© Цитата: Лысков Игорь Витальевич
При использовании регистра EDX, как хранителя цифры, получался в результате 0, т.к. регистр EDX после умножения обнулялся.
Всё ясно. Заработал мой арифмометр, как молодой. Благодаря вашей помощи. Теперь буду знакомить его с дробями (кнопкой ".").
smile

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 12

= общий = | 28.08.2018, 11:16 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
cupoma58:

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

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.14811 сек.

© 2001-2018, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.50 от 13.09.2018