Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа для ввода чисел из клавы 
V
    Опции темы
ROKI
Дата 13.12.2008, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 26.5.2008

Репутация: нет
Всего: нет



Привет всем. Вот код программы котороя осуществляет ввод десятичных числе из клавы:
Код

stek segment stack 
db 256 dup(?)
stek ends 

data segment 
buffer label byte 
maxKeys db 30 
inputs db ? 
keyboard db 30 dup(0) 
mnoz db 10 
a db ? 
b db ?
x db ?
data ends 

code segment 
assume cs:code, ss:stek, ds:data 
begin:

xor ax, ax
mov dx, offset buffer

mov ah, 0ah
int 21h  

mov cl, inputs
mov si, cx 
dec si 
add ax,1

mit: 
 mov bl,keyboard[si] 
 sub bl, 30h 
 push ax 
 mul bx
 add a, aх
 pop ax
 mul mnoz
 xor bx,bx
 dec si
 loop mit
 
 
mov ah, 4ch 
int 21h 
code ends 
end begin 

все выглядит красиво, но когда я комиплируюу данную программу, то копмилятору не нравится  вот эта строка ."add a, aх",  и он выдает ошибку: "Operand types do not match". В чем можэт быть проблема. И еще хочу попросить Вас, добавить к этой программи по возможности детальные комментарии,или объяснить принцип ее работы, потому что я ее не совсем понимаю. Зарание спасибо !
PM MAIL   Вверх
AndNot
Дата 14.12.2008, 05:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



Несовместимость типов: a - занимает 8-мь бит, а AX - 16 бит. Замени строку: 
Код
a db ?
на: 
Код
a dw ?
только этого будет недостаточно, в алгоритме есть ошибки: 
Код
mov cl, inputs
mov si, cx 
очевидно, что в SI будет помещен не конец введенной строки, а неизвестно что, поскольку регистр CH не инициализируется. Далее: 
Код
 mov bl,keyboard[si] 
 sub bl, 30h 
 push ax 
 mul bx
здесь очевидно, что в BH находится неопределенность. Исправляй пока эти косяки, а дальше заметишь ошибку самого алгоритма ;) 
PM MAIL   Вверх
ROKI
Дата 14.12.2008, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 26.5.2008

Репутация: нет
Всего: нет



AndNot, спасибо за ответ, ошыбки буду исправлять. Еще одна просьба, ты не мог бы прокоментировать етот участок кода:
Код

mov cl, inputs
mov si, cx 
dec si 
add ax,1

mit: 
 mov bl,keyboard[si] 
 sub bl, 30h 
 push ax 
 mul bx
 add a, aх
 pop ax
 mul mnoz
 xor bx,bx
 dec si
 loop mit

PM MAIL   Вверх
AndNot
Дата 15.12.2008, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



Окей. Сначала исправления:
Код
mov cl, inputs ; количество введенных символов
mov si, cx ; <- перед этой командой нужно обнулить старшую часть регистра CX (например: MOV CH,0)
dec si ; keyboard[si] - будет указывать на последний введенный символ
add ax,1 ; ????? загадка природы :D допустим здесь должно быть MOV AX, 1
; <- здесь нужно добавить MOV BH,0

mit: 
 mov bl,keyboard[si] ; BL - последний введенный символ
 sub bl, 30h ; перевод символа в число (проще так написать: sub bl, '0')
; т.е. для введенного '0' в BL будет ноль, для '9' - 9
 push ax 
 mul bx ; ОШИБКА: в регистре BH может быть мусор, нужно было перед циклом его обнулить
 add a, aх ; несоответствие типов, A должен быть объявлен как DW, к тому же 
; предварительно его нужно обнулить (или сразу задать нулевое значение, A DW 0)
; <- можно добавить ADC b, 0 для получения 32-х битного результата, 
; или просто выкинуть эту переменную, она не используется
 pop ax
 mul mnoz ; ax = ax*10, т.е. ax играет роль единиц, десятков,сотен и т.д.
; xor bx,bx ; <- с учетом исправлений это уже лишнее
 dec si
 loop mit ; продолжаем, пока CX > 0

Т.е. преобразование строки в число выглядит следующим образом. Допустим ввели строку: "145". в цикле начинаем разбор:
1 цикл: 
ax = 5 * 1 (bx * ax)
a = a + ax  ; a = 5
ax = AX * 10 ; т.е. ax = 10
2 цикл:
ax = 4 * 10 (ax)  ; (bx * ax)
a = a+ax ; a = 45
ax = AX * 10 ; т.е. ax = 100
3 цикл:
нет смысла считать, получим 145 (bl*100+45) smile

Это сообщение отредактировал(а) AndNot - 15.12.2008, 01:31
PM MAIL   Вверх
ROKI
Дата 15.12.2008, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 26.5.2008

Репутация: нет
Всего: нет



AndNot, спасибо тебе большое за коменты  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0408 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.