Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Программа для ввода чисел из клавы


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

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". В чем можэт быть проблема. И еще хочу попросить Вас, добавить к этой программи по возможности детальные комментарии,или объяснить принцип ее работы, потому что я ее не совсем понимаю. Зарание спасибо !

Автор: AndNot 14.12.2008, 05:57
Несовместимость типов: 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 находится неопределенность. Исправляй пока эти косяки, а дальше заметишь ошибку самого алгоритма ;) 

Автор: ROKI 14.12.2008, 16:56
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

Автор: AndNot 15.12.2008, 01:23
Окей. Сначала исправления:
Код
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

Автор: ROKI 15.12.2008, 21:01
AndNot, спасибо тебе большое за коменты  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)