Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
Jrog
0 / 0 / 0
Регистрация: 31.03.2016
Сообщений: 28
1

Ввод символов и отображение в различных системах счисления

31.03.2016, 16:22. Просмотров 2375. Ответов 20
Метки нет (Все метки)

Здравствуйте, форумчане!
Есть проблема, прошу подсказки. Нужно создать прогу на ассемблере, которая при введении с клавы двух байт (*1234 естественно в 16-ричной) пересчитывала бы их в другие, например в двоичную, десятичную, шестнадцатеричную и т.д. Сама логика перевода понятна, сравнение, добавление 30h или 37h (для hex) или деление на 10 (для 10-ричной). Мне непонятно, как сохранить введенные с клавы байты например в BX, чтобы потом из них доставать, преобразовывать и выводить на экран по своему желанию. Ниже приведу свои потуги, которые моментально выдадут во мне чайника. Наведите на путь истинный.
Assembler
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
[org 100h]
Start:
H1: db 82h, 82h, 85h, 84h, 88h, 92h, 85h, 20h, 
db 24h;Текст 
;--------------------------------------------------
mov dl,[H1]
call Write_str ; вывод на экран текста
call Write_digit_hex; вызов процедуры ввода с клавиатуры 1 байта
mov cl,4; смешение цифры из младшего полубайта в старший
shl dl,cl;
call Write_digit_hex
int 20h
;------------------------------------------------------
Write_str:
push ax
mov ah,9
int 21h
pop ax
ret
;------------------------------------------------------
Write_digit_hex:
push ax
push dx
mov ah,1
int 21h
mov dl,al
cmp dl,39h
jbe L1
sub dl,37h
L1:
sub dl,30h
int 21h
pop dx
pop ax
ret
;------------------------------------------------------
Write_str:
push ax
mov ah,9
int 21h
pop ax
Для справки, получаю второе высшее, учусь на заочном, по требованию ВУЗа компилировал через NASM, использую для проверки простой debug и командную строку. Пока что-то более совершенное и понятное мне недоступно в силу отсутствия понимания. Но за совет буду крайне признателен.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2016, 16:22
Ответы с готовыми решениями:

Ввод и вывод чисел в различных системах счисления
здравствуйте. помогите разработать программу Разработать программу перевода ввода и вывода чисел в...

Ввод и вывод чисел в различных системах счисления
Нужно выполнить перевод чисел из десятичной в двоичную систему счисления. Дать их внутреннее...

Ввод и вывод чисел в различных системах счисления, исправить код
.model small .stack 100h .data .code InputInt proc mov ah,0ah

Вывести числа в различных системах счисления
Помогите пожалуйста Составить программу решения. Значения переменных должны быть определены в...

20
tahir_
172 / 111 / 25
Регистрация: 18.05.2015
Сообщений: 480
31.03.2016, 16:34 2
Jrog, обработку из строки в число, тоже все просто,
например ввели 1234 = берем символ
1) (1 -30h)*1000
2) (2-30h)*100
3) (3-30h)*10
4) 4-30h
все складываем, получим число
1
Constantin Cat
2751 / 1502 / 421
Регистрация: 28.02.2015
Сообщений: 3,048
Завершенные тесты: 1
31.03.2016, 17:13 3
Assembler
1
2
3
4
[org 100h]
Start:
H1: db 82h, 82h, 85h, 84h, 88h, 92h, 85h, 20h, 
db 24h;Текст
Текст должен быть в конце программы. Или используйте переходы.
Assembler
1
mov dl,[H1]
Функция вывода строки работает с ds:dx, а не с DL

Опредделитесь, где должна стоять Write_str, до или после Write_digit_hex

Вы должны ввести два байта, а это 4-е цифры в 16-ой системе.
1
Jrog
0 / 0 / 0
Регистрация: 31.03.2016
Сообщений: 28
01.04.2016, 14:23  [ТС] 4
День добрый! Благодарю tahir и Constantin Cat за оперативную реакцию. Про функцию вывода не знал, спасибо, буду использовать впредь.
Constantin Cat, ввод 4-ех чисел реализовал через Write_digit_hex со смещением в старший полубайт, или я не так понял?
Tahir, по поводу "берем символ" как раз так и не понял. После ввода с клавы проверил содержание dl, судя по всему оно затирается, и ничего не остается после прерывания int 21. Поэтому и наивно полагал, что нужно как-то их в регистре например BX сохранить, а оттуда уже смело брать для обработки и дальнейшего отображения в нужной мне системе счисления с выводом на экран. Может просто не там смотрю, но debug ничего не показывает ни в dx ни в других регистрах.
0
tahir_
172 / 111 / 25
Регистрация: 18.05.2015
Сообщений: 480
01.04.2016, 16:01 5
Jrog, можно так, вот мой пример , писал для чела в другой теме.
Assembler
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
;Вычислить -2с-23d/(a/4)-1; a,c,d ввести с клавиатуры.
 
stak segment stack                          
      db 128 dup (?)                             
stak ends                               
data segment                                  
      a2 db (?)                              
      c2 db (?)                              
      d2 db (?)        
      
      a_a dw 0
      c_c dw 0
      d_d dw 0
 
    vvod db 4
    line db ?
  chislo db 3 dup (?) 
 
      a1 db 0dh,0ah,'введите a,$'                    
      c1 db 0dh,0ah,'введите c,$'                    
      d1 db 0dh,0ah,'введите d,$'
 
   otvet dd 0
 
       z db 0
                    
data ends                                 
 
code segment     
 
 assume ds:data,cs:code,ss:stak                      
 
start:                                   
 mov ax,data           
 mov ds,ax  
 
;;; a ;;;;;;;;;;;;                          
 lea dx,a1                          
 call text_1              
 lea dx,vvod                               
 call vvod_1
 call perevod
 mov [a2],al
 
;;; c ;;;;;;;;;;;;                          
 lea dx,c1                          
 call text_1              
 lea dx,vvod                               
 call vvod_1
 call perevod
 mov [c2],al
 
;;; d ;;;;;;;;;;;;                          
 lea dx,d1                          
 call text_1              
 lea dx,vvod                               
 call vvod_1
 call perevod
 mov [d2],al
 
 call formula
 
 
exit_dos:                  
 mov ax,4c00h                           
 int 21h    
                        
;-2с-23d/(a/4)-1 ;;;;;;;;;;;;;;;;;;;;;;;;;
formula:
 
;(a/4)-1
 xor ax,ax
 mov al,[a2]
 shr ax,2
 sub ax,1
 mov [a_a],ax 
 
;-2с
 xor ax,ax
 mov al,[c2]
 shl ax,1
 not ax
 mov [c_c],ax  
 
;-23d
 xor ax,ax
 mov al,d2
 mov cl,-23
 imul cl
 mov [d_d],ax
 
 int 3
 
 mov ax,[c_c] 
 sub ax,[d_d]
 mov cx,[a_a]
 xor dx,dx
 
 idiv cx
  
 
 ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
text_1:
 mov ah,09h
 int 21h
 ret
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
vvod_1:
 mov ah,0ah
 int 21h
 ret 
 
;perevod string = byte chislo ;;;;;;;;;;;;;
perevod:
 mov [z],0
 
 xor bx,bx
 xor ax,ax
 xor cx,cx
 
 cmp [line],2
 ja p1
 cmp [line],1
 ja p2
 jmp p3
 
; chislo * 100 
p1:
 mov al,[chislo+bx]  
 sub al,30h
 mov cx,2
 
p1_1:
 push cx
 mov cl,al
 shl al,3
 shl cl,1
 add al,cl    
 pop cx
 loop p1_1
 inc bx
 add [z],al
  
 
;; chislo * 10 
p2:
 mov al,[chislo+bx]  
 sub al,30h
 mov cl,al
 shl al,3
 shl cl,1
 add al,cl    
 add [z],al
 inc bx
 
;; chislo +
p3:
 mov al,[chislo+bx]  
 sub al,30h
 add [z],al
 
;vozvrat al=otvet
 mov al,[z]
 ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
code ends                                 
end start
обрати внимание на метку perevod:
1
Constantin Cat
2751 / 1502 / 421
Регистрация: 28.02.2015
Сообщений: 3,048
Завершенные тесты: 1
01.04.2016, 20:04 6
Лучший ответ Сообщение было отмечено Jrog как решение

Решение

Jrog, tahir_,
Да, как говорит Mikl___, "Знаете Вы толк в извращениях".


Вы работаете с числом, переводите число в любую СС(Система счисления), зачем извращатся ещё со строками? Работайте с числами сразу без всякого фанатизма?
Любая СС на входе(2..Z), любая СС c декрементом на выходе, и любое число в заданной СС.
Assembler
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
model   tiny
.code
org 100h
start:  lea dx,dbSiN
    mov si,10
    call    inpNum
    jc  start
    mov dwSin,di
@@00:   lea dx,dbInp
    mov si,dwSin
    call    inpNum
    jc  @@00
    mov dwNum,di
@@01:   lea dx,dbSon
    mov si,10
    call    inpNum
    jc  @@01
    mov ah,9
    lea dx,dbRes
    int 21h
@@02:   mov ax,di
    mov si,10
    call    outNum
    mov al,'='
    int 29h
    mov ax,dwnum
    mov si,di
    call    outNum
    mov al,10
    int 29h
    mov al,13
    int 29h
    dec di
    cmp di,1
    jnz @@02
    ret
inpNum  proc
    mov ah,9
    int 21h
    xor di,di
    mov bx,si
in01:   xor ax,ax
    int 16h
    mov ah,al
    cmp al,13
    jz  in04
    cmp ah,'a'
    jb  in02
    sub ah,'a'-'A'
    sub al,'a'-'A'
in02:   cmp ah,'A'
    jb  in03
    sub ah,7
in03:   sub ah,'0'
    js  in01
    cmp ah,bl
    jae in01
    push    ax
    int 29h
    pop ax
    mov al,ah
    xor ah,ah
    xchg    ax,di
    xor dx,dx
    mul si
    add di,ax
    or  dx,dx
    jz  in01
    mov ah,9
    lea dx,dbErr
    int 21h
    stc
in04:   ret 
inpNum  endp
outNum  proc
    xor cx,cx
on1:    xor dx,dx
    div si
    push    dx
    inc cx
    or  ax,ax
    jnz on1
    mov ax,' '-'0'-7
on2:    push    ax
    inc cx
    cmp cx,17
    jnz on2
on3:    pop ax
    cmp al,9
    jbe on4
    add al,7
on4:    add al,'0'
    int 29h
    loop    on3
    ret
outNum  endp
dbInp   db  10,13,'Enter number:$'
dbSon   db  10,13,'system output:$'
dbSin   db  10,13,'system input:$'
dbErr   db  10,13,'Error overflow$'
dbRes   db  10,13,'Result in any system:',10,13,'$'
dwnum   dw  ?
dwSin   dw  ?
    end start
1
tahir_
172 / 111 / 25
Регистрация: 18.05.2015
Сообщений: 480
01.04.2016, 22:50 7
Constantin Cat, на словах объясни, запутался, пример приведи пожалуйста
1
Constantin Cat
2751 / 1502 / 421
Регистрация: 28.02.2015
Сообщений: 3,048
Завершенные тесты: 1
04.04.2016, 08:26 8
tahir_, Что именно не понятно?
1
tahir_
172 / 111 / 25
Регистрация: 18.05.2015
Сообщений: 480
04.04.2016, 09:12 9
Constantin Cat, формат ввода пользователем, той программы который ты привел
1
Constantin Cat
2751 / 1502 / 421
Регистрация: 28.02.2015
Сообщений: 3,048
Завершенные тесты: 1
04.04.2016, 10:10 10
Ввод системы счисления в 10-ой системе, ввод числа пользователем в выбраной системе.
1
Jrog
0 / 0 / 0
Регистрация: 31.03.2016
Сообщений: 28
19.04.2016, 08:59  [ТС] 11
В продолжении темы опять обращаюсь к экспертам за советом. Написал код ввода 4-х hex чисел c клавы, который сохраняет их в регистре BX. В коде процедуры ввода и перевода из ISCII в hex возникли проблемы при компиляции, подскажите, где ошибка.
Assembler
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
[org 100h]
Start:  
  xor bx,bx
  mov cx,33
Print_text: 
  mov dl,[text1+bx]; печать текста 
  mov ah,02h
  int 21h
  inc bx
  loop Print_text
;------
  xor bx,bx
  xor ax,ax
  call Klav; ввод первой цифры с клавы
  xor bx,bx;
  mov bl,al;
  mov cl,04h;смещение из младшего полубайта в старший регистра bl
  shl bl,cl;
;------------------------
  call Klav;  ввод второй цифры с клавы
  add bl,al;  при суммировании регистр bl заполняется
  xchg bh,bl; данные из регистра bl попадают в bh
;------------------------
  call Klav; ввод третьей цифры с клавы
  mov bl,al; при суммирование регистр bl заполняется
  mov cl,04h;смещение из младшего полубайта в старший регистра bl 
  shl bl,cl
;------------------------
  call Klav; ввод четвертой цифры с клавы
  add bl,al; при суммировании регистр bl заполняется
  int 20h
;--------------------------------------------
text1 db 82h, 82h, 85h, 84h, 88h, 92h, 85h, 20h,
db 91h, 8eh, 84h, 85h, 90h, 86h, 88h, 8ch,
db 8eh, 85h, 20h, 90h, 85h, 83h, 88h, 91h,
db 92h, 90h, 80h, 20h, 42h, 50h, 20h, 20h; ВВЕДИТЕ СОДЕРЖИМОЕ РЕГИСТРА BP;
;---------------------------
Klav proc near
           mov ah,01; процедура ввода цифры с клавиатуры (1-F)
           int 21h  ; и перевод из ISCII в hex, результат остается в
           cmp al,39h; младшем полубайте al
           jbe .A
           sub al,37h
       .A:
           sub al,30h
           ret
Klav endp;
0
Миниатюры
Ввод символов и отображение в различных системах счисления  
Constantin Cat
2751 / 1502 / 421
Регистрация: 28.02.2015
Сообщений: 3,048
Завершенные тесты: 1
19.04.2016, 09:46 12
Jrog, сделал так, все получилось.
Assembler
1
2
3
4
5
6
7
8
9
10
Klav:; proc near
           mov ah,01; процедура ввода цифры с клавиатуры (1-F)
           int 21h  ; и перевод из ISCII в hex, результат остается в
           cmp al,39h; младшем полубайте al
           jbe .A
           sub al,7h;********** тут смотрите ************
       .A:
           sub al,30h
           ret
;Klav endp;
1
Jrog
0 / 0 / 0
Регистрация: 31.03.2016
Сообщений: 28
19.04.2016, 10:20  [ТС] 13
Спасибо за молниеносный ответ!
А зачем sub al,7h? Например при печати A (ISCII код 41h) нужно из него 37h вычесть, чтобы А получить.
0
Constantin Cat
2751 / 1502 / 421
Регистрация: 28.02.2015
Сообщений: 3,048
Завершенные тесты: 1
19.04.2016, 10:45 14
Jrog,
Вы набрали "А" отняли 0х37, а потом отняли ещё и 0х30, т.е. получается Вы отняли уже 0х67
1
R71MT
4619 / 1717 / 331
Регистрация: 29.07.2014
Сообщений: 2,699
Записей в блоге: 5
19.04.2016, 10:55 15
Jrog, вот тебе код, который сохраняет юзерское число в HEX, и выводит его на экран в различных СС.
Отличие в том, что сохраняется сразу всё число, а не каждый/его разряд.
Ошибки - не обрабатываются, числа - без знаковые, размер - word:

Кликните здесь для просмотра всего текста

Assembler
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
org  100h
jmp  start
 
mess0   db  13,10,' Input HEX digit: $'
mHex    db  13,10,' --------------------------'
        db  13,10,'             HEX: $'
mDec    db  13,10,'             DEC: $'
mOct    db  13,10,'             OCT: $'
mBin    db  13,10,'             BIN: $'
 
start:
   mov   dx,mess0
   call  MESSAGE
   call  ASC2HEX
   push  cx cx cx cx
 
   mov   dx,mHex
   call  MESSAGE
   pop   ax
   mov   bx,16             ; система счисления
   call  HEX2ASC
 
   mov   dx,mDec
   call  MESSAGE
   pop   ax
   mov   bx,10
   call  HEX2ASC
 
   mov   dx,mOct
   call  MESSAGE
   pop   ax
   mov   bx,8
   call  HEX2ASC
 
   mov   dx,mBin
   call  MESSAGE
   pop   ax
   mov   bx,2
   call  HEX2ASC
 
exit:
   xor   ax, ax
   int   16h
   int   20h
;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
;============== ВЫВОД НА ЭКРАН СРЕДСТВАМИ DOS ================================|
MESSAGE:
   mov   ah,9
   int   21h
ret
;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
;============== ПРОЦЕДУРА СОХРАНЕНИЯ ВВОДА В HEX-ФОРМАТЕ =====================|
ASC2HEX:
   XOR    CX,CX            ; копить число будем в CX
@0:                        ;
   MOV    AH,1             ; ввод с эхом средствами DOS
   INT    21h              ;
   CMP    AL,13            ; это ENTER ?!
   JE     stop             ; да - выходим из цикла ввода
   SUB    AL,30h           ; нет - переводим символ в цифру
   CMP    AL,9             ; это цифра 9 ?!
   JBE    @2               ; ниже/равно - не трогаем
   SUB    AL,11h           ; значит HEX-буква. Отнимаем от неё фактор
   CMP    AL,5             ; если заглавная буква, то остаток будет в пределах(5)
   JBE    @1               ;   ..ниже/равно - коррекция!
   SUB    AL,20h           ; значит прописная буква. Коррекция..
@1:                        ;
   ADD    AL,10            ; коррекция букв "A..F", в "11..15"
@2:                        ;
   SHL    CX,4             ; сдвигаем мл.тетраду(CL), в старшую
   OR     CL,AL            ; в мл.тетраду(CL) запишем наше число
   JMP    @0               ; читаем следующий символ..
stop:                      ; юзверь нажал ENTER! Результат у нас в CX.
RET                        ;
;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
;============== ФУНКЦИЯ ВЫВОДИТ НА ЭКРАН В РАЗЛИЧНЫХ СС =======================|
HEX2ASC:                   ;
   XOR   CX,CX             ; На входе: BX = система счисления, AX = число
isDiv:                     ;
   XOR   DX,DX             ; очистим место под остаток
   DIV   BX                ; разделим AX на фактор системы счисления
   PUSH  DX                ; сохраняем остаток от деления
   INC   CX                ; увеличим счётчик разрядности цифры
   OR    AX,AX             ; это последняя цифра?!
   JNZ   isDiv             ; нет - читаем следующую..
isOut:                     ; <-- в СХ у нас кол-во пуш'ей (для LOOP)
   POP   AX                ; снимаем со-стека остаток в обратном порядке
   CMP   AL,9              ; проверка на десятичную цифру
   JLE   noHex             ; меньше/равно? значит не HEX-цифра
   ADD   AL,7              ; иначе: коррекция для HEX
noHex:                     ;
   ADD   AL,30h            ; переводим цифру в символ
   INT   29h               ; выводим её на экран
   LOOP  isOut             ; мотаем цикл CX-раз..
RET                        ;
1
Jrog
0 / 0 / 0
Регистрация: 31.03.2016
Сообщений: 28
11.05.2016, 13:43  [ТС] 16
Огромное спасибо R71MT за отличный код. Вроде разобрался, но пришлось модернизировать его немного. В частности поменять 1-ю функцию на 8-ю 21-го прерывания и ввести алгоритм, который не позволяет при вводе с клавиатуры вводить какие-либо символы кроме 0-9 A-F. И тут возникла проблема с переводом из ASC2 в HEX. Почему-то игнорируются операции SUB AL,30h и SUB AL,37h.
Прошу помочь разобраться, так как сам найти ошибку не могу, я ее просто не вижу.
Заранее благодарен.

Assembler
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
;============== ПРОЦЕДУРА СОХРАНЕНИЯ ВВОДА В HEX-ФОРМАТЕ =====================|
ASC2HEX:
   XOR    CX,CX
@0:                        ;
   MOV   AH,8             ; ввод ,БЕЗ ЭХА средствами DOS
   INT   21h              ;
   CMP   AL,13            ; это ENTER ?!
   JE    stop             ; да - выходим из цикла ввода
   MOV   DL,AL            ; скидываем введенное число в DL
   CMP   AL,30h           ; введенное число asc2
   JB    @0               ; меньше 30? значит в начало
   CMP   AL,39h           ; может больше 39? да - направляем на проверку
   JA    l_41             ; в l_41
   SUB   AL,30h           ; меньше/равно 39, вычитаем 30h
   JMP   @1               ; и направляем dl на печать
l_41:
   CMP   AL,41h           ; если  41h>al>39h, в начало ввода
   JB    @0
   CMP   AL,46h           ; если al>46h в начало ввода
   JA    @0
   SUB   AL,37h           ; если  41h<al<46h, отнимаем 37h и направляем на печать 
@1:
   MOV   AH,2             ; печать средствами DOS
   INT   21h
@2:                        ;
   SHL    CX,4             ; сдвигаем мл.полубайт (CL), в старший
   OR     CL,AL            ; в мл.полубайте (CL) запишем наше число
   JMP    @0               ; читаем следующий символ..          
stop:                      ; Если нажал ENTER, то результат у нас в CX.
RET                        ;
;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
0
Миниатюры
Ввод символов и отображение в различных системах счисления  
Constantin Cat
2751 / 1502 / 421
Регистрация: 28.02.2015
Сообщений: 3,048
Завершенные тесты: 1
11.05.2016, 14:19 17
Цитата Сообщение от Jrog Посмотреть сообщение
И тут возникла проблема с переводом из ASC2 в HEX. Почему-то игнорируются операции SUB AL,30h и SUB AL,37h.
Аккумулятор один из самих убиваемых регистров.
Формирование НЕХ числа переместите перед функцией вывода.
1
_lTaNaToSl_
0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 65
10.09.2016, 07:15 18
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Jrog,
Вы набрали "А" отняли 0х37, а потом отняли ещё и 0х30, т.е. получается Вы отняли уже 0х67
Скажите пожалуйста, зачем мы вообще используем sub al, 30h ??? Никак не пойму, зачем нам вычитать 0?
0
R71MT
4619 / 1717 / 331
Регистрация: 29.07.2014
Сообщений: 2,699
Записей в блоге: 5
10.09.2016, 07:59 19
_lTaNaToSl_, число вводят для каких-нибудь математических операций, а не просто, чтоб его показать. Поэтому разделяются понятия: число и символ числа. Если посмотреть на ASCII-таблицу символов, то там видно, что числам 0-9 соответствуют коды символов 30-39h. То есть разница между числом и его символом составляет 30h.

В BCD-арифметике, математические операции можно производить и с ASCII-символами, но это неудобно. Поэтому символы переводят в числа, отняв от него 30h
0
_lTaNaToSl_
0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 65
10.09.2016, 08:08 20
Цитата Сообщение от R71MT Посмотреть сообщение
_lTaNaToSl_, число вводят для каких-нибудь математических операций, а не просто, чтоб его показать. Поэтому разделяются понятия: число и символ числа. Если посмотреть на ASCII-таблицу символов, то там видно, что числам 0-9 соответствуют коды символов 30-39h. То есть разница между числом и его символом составляет 30h.

В BCD-арифметике, математические операции можно производить и с ASCII-символами, но это неудобно. Поэтому символы переводят в числа, отняв от него 30h
Т.е при вводе 1, 2, 3 символов мы будем переводить их в числа 1, 2, 3?
Если я не правильно понял, поделитесь своим примером пожалуйста
0
10.09.2016, 08:08
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2016, 08:08

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Программа для расчета выражения. Ввод/вывод в разных системах счисления
Разработать алгоритм и программу расчета выражения в соответствии с индивидуальным заданием на...

Числа в разных системах счисления
Задана строка, представляющая собой запись числа. Определить в какой системе счисления (с...

Организовать ввод значений в различных системах счисления
Всем привет, делаю калькулятор и есть некоторые трудности! В общем, шкодю в WPF ХAML C#, и пытаюсь...

Вычитание в различных системах счисления
Даны два числа в десятичной системе счисления: 171 и 219. Нужно выполнить их перевод в двоичную,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.