CyberForum.ru - Форум программистов и сисадминов
Вернуться   Форум программистов и сисадминов CyberForum.ru > Форум программистов > Форум Низкоуровневое программирование > Форум Assembler, MASM, TASM

Ответ Создать новую тему
 
Старый 19.12.2010, 17:58   #1
Ortega
Новичок
 
Аватар для Ortega
 
Регистрация: 19.12.2010
Сообщений: 9
Репутация: 0 (0)
По умолчанию Ввод десятичного числа с клавиатуры

Есть код, где вводится с клавиатуры число. его нужно преобразовать чтобы дальше с ним работать. В Number заноситься не правильно

Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
.data
    numBuf db ?
    Number dw 0
    numZnam dw 1
    ZNAM_1 dw 10
    strNumber db 7 DUP(?)
 
 
mov ah, 0Ah
    mov strNumber[0], 5
    lea dx, strNumber
    int 21h         ;вводим  с клавиатуры
    
    ;преобразуем строку в число
    
    mov bl, strNumber[1]
    mov bh, 0
    mov SI, bx    
    inc bx
    mov CX, bx
    
    looper:
        mov bl, strNumber[SI+2]
        mov numBuf, bl ; в numBuf символ 
        
        mov al, numBuf 
        sub al, 30h                          ; в al число
        mov ah, 0
        mul numZnam                          ; умножили на "знаменатель" для него
        
        add Number, ax                           ; добавили это число к переменной
        dec SI 
        
        mov ax, numZnam
        mul ZNAM_1
        mov numZnam, ax                          ;увеличили "знаменатель" в 10 раз
    loop looper
Ortega вне форума
Другие темы раздела
скопировать данные из одного массива(1000 элементов) в другой Assembler, MASM, TASM
вот есть код. само задание: скопировать данные из одного массива(1000 элементов) в другой. прога компилируется, а потом сразу же выкидывает. выделяет строку rep movsb. почему оно не работает? # include <iostream.h> # include <conio.h> # include <stdlib.h> # include <iomanip.h> void main().... скопировать данные из одного массива(1000 элементов) в другой
Assembler, MASM, TASM Составить программу вычисления X в зависимости от значения символа simv
Здравствуйте помогите пожалуйста решить задачки. 1. Составить программу вычисления y по формуле y=4v+d*m-3g+1 Исходные данные : • Дата рождения студента в формате ДД-ММ-ГГ- числа –d,m,g(байт) • Возраст студента (количество полных лет)-число v (байт) 2. Составить программу вычисления X в.... Составить программу вычисления X в зависимости от значения символа simv
Старый 19.12.2010, 18:33   #2
murderer
Форумчанин
 
Регистрация: 06.10.2010
Сообщений: 1,519
Репутация: 848 (756)
По умолчанию Re: Ввод десятичного числа с клавиатуры

Код ASM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
.model tiny
.code
.486
org 100h
start:
  mov ah,10
  mov dx,offset strNumber
  int 21h                 ;вводим  с клавиатуры
    
  ;преобразуем строку в число
  movzx cx,[strNumber+1]
  mov   si,offset strNumber+2
  xor   eax,eax
  cdq
  str2int:lodsb
          lea edx,[edx*4+edx]
          lea edx,[edx*2+eax-48]
  loop str2int
  
  ;Теперь в edx число
ret
    
strNumber db 5, 6 DUP(0)
 
end start
 
murderer вне форума
Старый 19.12.2010, 19:34  [ТС]   #3
Ortega
Новичок
 
Аватар для Ortega
 
Регистрация: 19.12.2010
Сообщений: 9
Репутация: 0 (0)
По умолчанию Re: Ввод десятичного числа с клавиатуры

А чтобы поместить число из edx нужна переменная 4ное слово?
и вопрос что делает функция lodsb?
Ortega вне форума
Старый 19.12.2010, 19:48   #4
murderer
Форумчанин
 
Регистрация: 06.10.2010
Сообщений: 1,519
Репутация: 848 (756)
По умолчанию Re: Ввод десятичного числа с клавиатуры

Цитата Сообщение от Ortega Посмотреть сообщение
А чтобы поместить число из edx нужна переменная 4ное слово?
Не обязательно. Можно копировать из dx или dl.

Цитата Сообщение от Ortega Посмотреть сообщение
и вопрос что делает функция lodsb?
Легко нагугливается
http://www.firststeps.ru/asm/r.php?47
murderer вне форума
Старый 19.12.2010, 19:53  [ТС]   #5
Ortega
Новичок
 
Аватар для Ortega
 
Регистрация: 19.12.2010
Сообщений: 9
Репутация: 0 (0)
По умолчанию Re: Ввод десятичного числа с клавиатуры

Цитата Сообщение от murderer Посмотреть сообщение
Не обязательно. Можно копировать из dx или dl.
то есть если я напишу
Код
1
mov number, dx
все число поместится в переменную?
Ortega вне форума
Старый 19.12.2010, 20:01   #6
murderer
Форумчанин
 
Регистрация: 06.10.2010
Сообщений: 1,519
Репутация: 848 (756)
По умолчанию Re: Ввод десятичного числа с клавиатуры

Поместятся младшие два байта. То есть если ты введёшь число, меньшее чем 2^16, всё будет работать правильно.
murderer вне форума
Старый 19.12.2010, 20:41  [ТС]   #7
Ortega
Новичок
 
Аватар для Ortega
 
Регистрация: 19.12.2010
Сообщений: 9
Репутация: 0 (0)
По умолчанию Re: Ввод десятичного числа с клавиатуры

Цитата Сообщение от murderer Посмотреть сообщение
Поместятся младшие два байта. То есть если ты введёшь число меньше чем 2^16 всё будет работать правильно.
ну у меня пределы от 0 до 3999. и переменная Number dw


Спасибо огромное за помощь

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

Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
model small
.data
        pin db "Please, input the number(0...3999): $"    
        ferr db "Error!$"
        rom db "Roman number is:$"
        strNumber db 5, 6 DUP(0)
        Number dd 0
        CR_LF   db 13,10,"$"
        m db  "M$"                            ;  M dw  1000         
        cm db "CM$"                           ;  CM dw  900 
        d db  "D$"                            ;  D dw   500 
        cd db "CD$"                           ;  CD dw  400 
        c db  "C$"                            ;  C db   100 
        xc db "XC$"                           ;  XC db   90
        l db  "L$"                            ;  L db    50
        xl db "XL$"                           ;  XL db   40
        x db  "X$"                            ;  X db    10
        ix db "IX$"                           ;  IX db    9
        v db  "V$"                            ;  V db     5
        iv db "IV$"                           ;  IV db    4
    i db  "I$"                            ;  I db     1   
 
org 100h        
.code
.486 
START:   
    mov ax, @data
    mov ds, ax
    
    mov ah, 09h
    lea dx, pin        ; vivod podskazki
    int 21h 
 
        mov ah,10
        mov dx,offset strNumber
        int 21h                 ;вводим  с клавиатуры
            
        ;преобразуем строку в число
        movzx cx,[strNumber+1]
        mov   si,offset strNumber+2
        xor   eax,eax
        cdq
 str2int: lodsb
          lea edx,[edx*4+edx]
          lea edx,[edx*2+eax-48]
 loop str2int          ;Теперь в edx число
        ret
        
        cmp edx,0
        jb fin
        cmp edx,4000
        jae fin
        
        mov Number, edx             
        
        mov ah, 09h         ;каретка
        mov dx, offset CR_LF
        int 21h         
    mov ah, 09h
        lea dx, rom             ;roman number is
        int 21h
        
th:     cmp Number,1000
        jge met1
        cmp Number,900
        jge met2
        cmp Number,500
        jge met3
        cmp Number,400
        jge met4
        jmp hun
 
met1:   mov ah, 09h         ;M
        mov dx,offset m
        int 21h 
        sub Number,1000
        jmp th
              
met2:   mov ah, 09h         ;CM
        mov dx,offset cm
        int 21h        
        sub Number,900
        jmp hun
        
met3:   mov ah, 09h         ;D
        mov dx,offset d
        int 21h        
        sub Number,500
        jmp hun
                
met4:   mov ah, 09h         ;CD
        mov dx,offset cd
        int 21h        
        sub Number,400        
        jmp hun
        
hun:    cmp Number,100
        jge met5
        cmp Number,90
        jge met6
        cmp Number,50
        jge met7
        cmp Number,40
        jge met8
        jmp ten        
        
met5:   mov ah, 09h         ;C
        mov dx,offset c
        int 21h 
        sub Number,100
        jmp hun 
             
met6:   mov ah, 09h         ;XC
        mov dx,offset xc
        int 21h        
        sub Number,90
        jmp ten
        
met7:   mov ah, 09h         ;L
        mov dx,offset l
        int 21h        
        sub Number,50 
        jmp ten
               
met8:   mov ah, 09h         ;XL
        mov dx,offset xl
        int 21h        
        sub Number,40  
        jmp ten
        
ten:    cmp Number,10
        jge met9
        cmp Number,9
        jge met10
        cmp Number,5
        jge met11
        cmp Number,4
        jge met12
        jmp one
        
met9:   mov ah, 09h         ;X
        mov dx,offset x
        int 21h 
        sub Number,10
        jmp ten
              
met10:  mov ah, 09h         ;IX
        mov dx,offset ix
        int 21h        
        sub Number,9
        jmp one
        
met11:  mov ah, 09h         ;V
        mov dx,offset v
        int 21h        
        sub Number,5
        jmp one
                
met12:  mov ah, 09h         ;IV
        mov dx,offset iv
        int 21h        
        sub Number,4 
        jmp one
                    
one:    cmp Number,1
        jl fin
        mov ah, 09h         ;I
        mov dx,offset i
        int 21h        
        sub Number,1
        jmp one
                    
              
  fin:  mov ah, 01h
        int 21h
    mov ah, 4ch
    int 21h
END START      
Ortega вне форума
Старый 19.12.2010, 20:46   #8
murderer
Форумчанин
 
Регистрация: 06.10.2010
Сообщений: 1,519
Репутация: 848 (756)
По умолчанию Re: Ввод десятичного числа с клавиатуры

В 47 строке удали ret
murderer вне форума
Старый 19.12.2010, 20:49  [ТС]   #9
Ortega
Новичок
 
Аватар для Ortega
 
Регистрация: 19.12.2010
Сообщений: 9
Репутация: 0 (0)
По умолчанию Re: Ввод десятичного числа с клавиатуры

Цитата Сообщение от murderer Посмотреть сообщение
В 47 строке удали ret
А ларчик просто открывался)))
Спасибо ещё раз. всё работает0
Ortega вне форума
После регистрации реклама в сообщениях будет скрыта
Старый 19.12.2010, 20:51   #10
murderer
Форумчанин
 
Регистрация: 06.10.2010
Сообщений: 1,519
Репутация: 848 (756)
По умолчанию Re: Ввод десятичного числа с клавиатуры

Думаю программу можно упростить если использовать массив указателей
Системный таймер..
murderer вне форума
Ответ Создать новую тему

Похожие темы
Тема Автор
Assembler, MASM, TASM ввод числа с клавиатуры
нужно ввести с клавиатуры число(будущее количество эл-в маллива). число от 1 до 30, те: 1)если сначала нажали 0 - недопустимо(потом могут нажать enter и в итоге получится 0 эл-в в массиве) 2)если 3, то конец и n будет равно 30(>30 нельзя) 3)если свели 2 цифры то тоже конец ввода(дальше будет...
temich-92
C# для начинающих Программа пишет прописью числа, помогите доделать ввод числа с клавиатуры
Программа пишет прописью числа, помогите доделать ввод числа с клавиатуры. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication19 { class Program : NumByWords {
maniac0192
Assembler, MASM, TASM Ввод десятичного числа в качестве аргумента для номера строки и столбца курсора
Приветствую вас! Подскажите как в данном коде осуществить ввод двух десятичных чисел, которые далее нужно будет использовать в качестве координат для установки курсора... stacksg segment stack db 128 dup(?) stacksg ends
Cheater_
Assembler, MASM, TASM Ввод десятичного числа в диапазоне 0-255 и вывод его значения в двоичной системе.
Ввод десятичного числа в диапазоне 0-255 и вывод его значения в двоичной системе.
Paha10
Assembler, MASM, TASM Ввод десятичного числа в диапазоне 0-255 и вывод его значения в двоичной системе
Напишите программу плз. Ввод десятичного числа в диапазоне 0-255 и вывод его значения в двоичной системе.
Paha10
Опции темы

Текущее время: 21:22. Часовой пояс GMT +4.

Компьютерный форум программистов и сисадминов
Powered by vBulletin® Version 3.8.7 PL2
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Рейтинг@Mail.ru Яндекс.Метрика