Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/22: Рейтинг темы: голосов - 22, средняя оценка - 4.95
4 / 4 / 0
Регистрация: 24.12.2014
Сообщений: 31
1

Ввести два числа, одно в двоичной форме, другое в шестнадцатеричной, сравнить их и вывести результат

10.11.2019, 14:26. Показов 4354. Ответов 48
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.

Прошу помощи.
Собственно есть задание: "Ввести два числа, одно в двоичной форме, другое в шестнадцатеричной, сравнить их и вывести результат."

Есть код, который я пытался писать и понимать на протяжении 3ех дней)
Понимаю что, то что тут написано скорее всего в корне не верно, но что-то совсем сложно у меня ассемблер идет, прошу помощи или хотя-бы толчка в нужном направлении... Писал код с помощью эмулятора emu8086, поэтому все пояснения после ";" идут в английском транслите. Некоторые части кода брал из сети, в процессе изучения)
p.s 16битная система выбрана опять же по причине обучения в сети, там было сказано, что так легче)
Дошел до следующего вида -
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
use16
org 0x100
 
mov dx, privet
mov ah, 9 ; BuBog CTpoKu
int 21h   ; next geucTBue
 
mov dx, first
mov ah, 9
int 21h
 
mov cx,8 ; nogroToBka nepemeHHux
    mov dx,0 ; resultat
 
m1:
    push dx ; np94em B cTek
 
    mov ah,1 ; BBOg
    int 21h
 
    pop dx ; gocTaem
    shl dx,1 ; cgBuraeM Ha 1 bit 
 
    cmp al,'1'
        jnz m2
    or dx,1 ; if BBegeH cymbol 1 - ycTaHoBuM MJlagwuu bit
 
m2:
    loop m1 ; koHec
    
mov dl, al
int 21h
 
 
mov dx, second
mov ah, 9
int 21h
 
mov ah,1 ; BBog 1 cymbola
        int 21h
 
        cmp al, 'a' ; a - small
        jb m3
        
        cmp al, 'f'
        ja input_error
 
        sub al,'a' + 0ah
        jmp input_rezult
    
        ; 3arJlaBHa9
m3:
        cmp al, 'A' ; A - 6oJlwa9
        jb m4
        
        cmp al, 'F'
        ja input_error
 
        sub al,'A' + 0ah
        jmp input_rezult
 
m4:
        ; 4ucjla
 
        cmp al, '0' ; 0 - null
        jb input_rezult
        
        cmp al, '9'
        ja input_error
 
        sub al,'0' + 0
        jmp input_rezult
 
input_error: 
        mov al,0
input_rezult:
 
 
mov bl, al  ; noMewaeM B bl 4ucJlo 
int 21h
 
 
 
mov dx, result
mov ah, 9
int 21h
 
 
cmp bl,dl     ; cpaBHuBaem 4ucJla
jg a_bolshe_b
jl a_menshe_b
jz a_ravno_b
 
a_bolshe_b:
mov ah,09
mov dx,bolshe
int 21h
jmp exit
 
a_menshe_b:
mov ah,09
mov dx,menshe
int 21h
jmp exit
 
a_ravno_b:
mov ah,09
mov dx,ravno
int 21h
 
exit:
mov ah,08h
int 21h
 
mov ax,4c00h
int 21h
 
 
 
 
 
 
 
 
 
privet db 13,10, "Rabotu vipolnil Valdemar Zigritovich$"
bolshe  db 13,10, "a>b$"
menshe db 13,10, "a<b$"
ravno db 13,10, "a=b$"
first db 13,10, "Vvedite chislo a v dvoichnoy forme:$"
second db 13,10, "Vvedite chislo b v 16richnoi forme:$" 
result db 13,10, "Vash resulatat:$"

P.p.s. Кстати части ввода двоичного и шестнадцатеричного чисел были взяты прямиком из задания, их первоначальный вид:
Двоичное:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mov cx,8 ; подготовка переменных 
    mov dx,0 ; dx - результат
m1:
    push dx ; "спрячем" на время в стеке 
 
    mov ah,1 ; введем с клавиатуры 1 символ
    int 21h
 
    pop dx ; вернем из стека
    shl dx,1 ; сдвинем на 1 бит 
 
    cmp al,'1'
        jnz m2
    or dx,1 ; если был введен символ '1' - установим младший бит
      m2:
    loop m1 ; конец цикла
Шестнадцатеричное:
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
mov ah,1 ; введем 1 символ
        int 21h
 
        cmp al, 'a' ; a - маленькая английская
        jb m1
        
        cmp al, 'f'
        ja input_error
 
        sub al,'a' + 0ah
        jmp input_rezult
    
        ; аналогично для заглавной буквы
m1:
        cmp al, 'A' ; A - большая английская
        jb m2
        
        cmp al, 'F'
        ja input_error
 
        sub al,'A' + 0ah
        jmp input_rezult
 
    m2:
        ; аналогично для цифр
 
        cmp al, '0' ; 0 - ноль
        jb input_rezult
        
        cmp al, '9'
        ja input_error
 
        sub al,'0' + 0
        jmp input_rezult
 
input_error: 
        mov al,0
input_rezult:
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2019, 14:26
Ответы с готовыми решениями:

Ввести с клавиатуры два целых числа в двоичной форме и вычислить их суммы
Ввести с клавиатуры два целых числа в двоичной форме. Написать программу вычисления их суммы. ...

Вводятся два числа в шестнадцатеричной сс. Умножить их и вывести результат на экран в десятичной сс
помогите написать программу на ассемблере: Вводятся два числа в шестнадцатеричной системе...

Вводятся два числа в десятичной системе Найти их произведение и вывести результат на экран в шестнадцатеричной
А можно наоборот из 10-ной в 16-ю у меня не получается, что-то в переводе не правильно...

Сравнить два числа и вывести результат сравнения
2.Написать функцию, которая сравнивает два числа и выводит результат сравнения.

48
Модератор
Эксперт по электронике
8477 / 4335 / 1643
Регистрация: 01.02.2015
Сообщений: 13,462
Записей в блоге: 8
10.11.2019, 15:03 2
А из этого хоть что-то компилируется?
И где итоговый код, который компилируется (т.е. не содержит опечаток), хотя и неправильно работает?
0
4 / 4 / 0
Регистрация: 24.12.2014
Сообщений: 31
10.11.2019, 15:21  [ТС] 3
ФедосеевПавел, Что-то компилируется, во вложении то, что выдает "программа")
На счет итогового кода немного не понял о чем вы спрашиваете, тот код что первый в моем посте, это на данный момент, то на чем я остановился, работает он через одно место и опечаток очевидно там уйма.
Миниатюры
Ввести два числа, одно в двоичной форме, другое в шестнадцатеричной, сравнить их и вывести результат  
0
Модератор
Эксперт по электронике
8477 / 4335 / 1643
Регистрация: 01.02.2015
Сообщений: 13,462
Записей в блоге: 8
10.11.2019, 15:38 4
1. вы не выделили память для переменных a и b - и до сравнения они теряются в регистрах.
2. удобнее разделять мегакод на фрагменты, т.е. основная программа лучше чтобы выглядела
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
mov dx, privet
mov ah, 9 ; BuBog CTpoKu
int 21h   ; next geucTBue
 
call GetBin
mov [a], al
 
call GetHex
mov [b], al
 
mov al, [a]
cmp al, [b]
jb @@below
ja @@above
 
;вывод сообщения о равенстве
.....
jmp @@exit
 
@@below:
;вывод сообщения "меньше"
.....
jmp @@exit
 
@@above:
;вывод сообщения "больше"
.....
jmp @@exit
 
@@exit:
mov ah,08h
int 21h
 
mov ax, 4C00h
inn 21h
Так ведь проще. А потом реализовать процедуры ввода.
0
4 / 4 / 0
Регистрация: 24.12.2014
Сообщений: 31
10.11.2019, 16:42  [ТС] 5
ФедосеевПавел, Сижу уже час туплю, не пойму как выделить память под переменные(
Как понял это делается с помощью регистра eax, который в своем роде делится на ah и al, но что-то у меня ничего не получатся... (Хотя может и бред несу)
Можете пожалуйста ткнуть меня носом, в статью может, где это объясняется?
0
Модератор
Эксперт по электронике
8477 / 4335 / 1643
Регистрация: 01.02.2015
Сообщений: 13,462
Записей в блоге: 8
10.11.2019, 17:41 6
Assembler
1
2
a db ?
b db ?
Директивы определения данных
Посмотреть в любом учебнике, например глава 6 Электронный учебник

Не по теме:

при сбое форума обрезалась часть статьи - за 30 минут восстановлю, но найти можете в другом месте



Добавлено через 45 минут

Не по теме:

исправил (восстановил) главу 6 - она теперь из трёх частей

0
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
10.11.2019, 18:20 7
Код TASM:
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
model   tiny,pascal
.code
org 100h
begin:  lea ax,db1st
    call    InpNum,ax,2
    mov dw1,ax
    lea ax,db2nd
    call    InpNum,ax,16
    lea dx,dbEqu
    cmp ax,dw1
    jz  @@01
    lea dx,dbBig
    ja  @@01
    lea dx,dbLow
@@01:   mov ah,9
    int 21h
    xor ax,ax
    int 16h
    ret
InpNum  proc    a:word,b:word
uses    bx,cx,dx
    mov ah,9
    mov dx,a
    int 21h
    xor bx,bx
IN1:    xor ax,ax
    int 16h
    cmp al,13
    jz  IN3
    mov ah,al
    sub ah,'0'
    cmp ah,10
    jb  IN2
    and al,11011111b
    mov ah,al
    sub ah,'7'
IN2:    mov dx,b
    cmp ah,dl
    jae IN1
    push    ax
    int 29h
    pop ax
    mov al,ah
    and ax,0Fh
    xchg    ax,bx
    mul b
    add bx,ax
    jmp IN1
IN3:    mov ax,bx
    ret
InpNum  endp
db1st   db  10,13,'Enter bin number:$'
db2nd   db  10,13,'Enter hex number:$'
dbEqu   db  10,13,'Bin = Hex$'
dbLow   db  10,13,'Bin > Hex$'
dbBig   db  10,13,'Bin < Hex$'
dw1 dw  ?
dw2 dw  ?
end begin
Эму не перевариваю, чисто принцыпиально.
Результат такой:

введенное число на переполнение разрядной сетки 16 бит не проверяется, за все отвечаете Вы.
Миниатюры
Ввести два числа, одно в двоичной форме, другое в шестнадцатеричной, сравнить их и вывести результат  
1
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
10.11.2019, 18:35 8
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Посмотреть в любом учебнике
Добавьте в "Ввод вывод" подпрограмму InpNum как универсальную, в любой с/с будет работать

Добавлено через 3 минуты
+ контроль ввода

минуса правда нет.
1
Модератор
Эксперт по электронике
8477 / 4335 / 1643
Регистрация: 01.02.2015
Сообщений: 13,462
Записей в блоге: 8
10.11.2019, 18:40 9
А описание к ней? К тому же она не универсальна - в emu8086 работать не будет, а пользователей с emu8086 достаточно много.

Думаю, что в "Вводе выводе" достаточно однотипных примеров. Можно остановить её наполнение.
0
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
10.11.2019, 18:48 10
Чуть позже найду на форуме и добавлю ссылку на ввод числа, совмещённый со вводом с клавиатуры и фильтрацией "не цифр" от Constantin Cat. Я его видел, но сразу не могу найти.
Помните, кто это написал тут
Чтобы не искали потом.
1
4 / 4 / 0
Регистрация: 24.12.2014
Сообщений: 31
10.11.2019, 18:59  [ТС] 11
ФедосеевПавел, Постарался сделать код согласно вашему примеру, но что-то он совсем не работает, доходит до ввода второго числа и вылетает с ошибкой. Что в коде не так?
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
use16
org 0x100
 
a db ?
b db ?
 
mov dx, privet
mov ah, 9 ; BuBog CTpoKu
int 21h   ; next geucTBue
 
call GetBin
mov [a], al
 
call GetHex
mov [b], al
 
mov dx, result
mov ah, 9
int 21h
 
mov al, [a]
cmp al, [b]
 
jb @@below
ja @@above
 
db "a=b$"
 
jmp @@exit
 
@@below: db "a<b$"
;vivod soobweniya menshe 
 
jmp @@exit
 
@@above: db "a>b$"
;vivod soobweniya bolwe  
 
jmp @@exit
 
@@exit:
mov ah,08h
int 21h
 
mov ax, 4C00h
int 21h
 
 
 
GetBin:
 
mov dx, first
mov ah, 9
int 21h
 
mov cx,8 ; podgotovka peremennih
mov dx,0 ; dx - rezultat
 
m1:
push dx ; pryachem na vremya v stek 
mov ah,1 ; vvedem s klaviaturi 1 symbol
int 21h
pop dx ; vernem dx iz steka
shl dx,1 ; sdvinem na 1 bit 
cmp al,'1'
jnz m2
or dx,1 ; esli bil viden symbol 1 - ustanovim mladshiy bit
 
m2:
loop m1 ; konec cykla
 
int 21h   ; next geucTBue
 
 
 
 
GetHex:
 
mov dx, second
mov ah, 9
int 21h
 
mov ah,1 ; vvedem 1 symbol
int 21h
cmp al, 'a' ; a - malenkaya
jb m3
        
cmp al, 'f'
ja input_error
 
sub al,'a' + 0ah
jmp input_rezult
    
; analogichno dlya zaglavnoy
m3:
cmp al, 'A' ; A - bolshayaÿ
jb m4
        
cmp al, 'F'
ja input_error
 
sub al,'A' + 0ah
jmp input_rezult
 
m4:
; analogichno dlya cifr
 
cmp al, '0' ; 0 - null
jb input_rezult
        
cmp al, '9'
ja input_error
 
sub al,'0' + 0
jmp input_rezult
 
input_error: 
mov al,0
input_rezult:  
 
int 21h   ; next geucTBue
 
 
privet db "Rabotu vipolnil ya s pomoshyu=)$"
first db 13,10, "Vvedite chislo a v dvoichnoy forme:$"
second db 13,10, "Vvedite chislo b v 16richnoi forme:$" 
result db 13,10, "Vash resulatat:$"
Добавлено через 10 минут
Constantin Cat, Спасибо за помощь, но к сожалению, мне надо придерживаться способа ввода переменных описанных в первом посте
0
Модератор
Эксперт по электронике
8477 / 4335 / 1643
Регистрация: 01.02.2015
Сообщений: 13,462
Записей в блоге: 8
10.11.2019, 19:00 12
Assembler
21
22
23
24
25
26
27
28
29
30
31
32
mov al, [a]
cmp al, [b]
 
jb @@below
ja @@above
 
db "a=b$"
 
jmp @@exit
 
@@below: db "a<b$"
;vivod soobweniya menshe
потому, что в строке 27 не вывод сообщения, а определение данных, которые остаются в том месте, где их определили - это не C, в котором переменные определяют в произвольных местах.
В ассемблере после перехода на метку @@above будет выполнятся код, соответствующий команде со значением опкода, равного значению символа "a" и т.д. - т.е. вы передаёте управление на случайный код.

Вы же уже выводили сообщение в самом начале программы - текст из переменной privet, и через 5 часов уже разучились.
0
4 / 4 / 0
Регистрация: 24.12.2014
Сообщений: 31
10.11.2019, 19:14  [ТС] 13
ФедосеевПавел,
Про вывод текста понял, мой косяк, просто сделал перерыв и после него чет забылось)
Вроде исправил, но ситуация не изменилась, или я опять что-то пропустил?
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
use16
org 0x100
 
a db ?
b db ?
 
mov dx, privet
mov ah, 9 ; BuBog CTpoKu
int 21h   ; next geucTBue
 
call GetBin
mov [a], al
 
call GetHex
mov [b], al
 
mov dx, result
mov ah, 9
int 21h
 
mov al, [a]
cmp al, [b]
 
jb @@below
ja @@above
 
mov dx, ravno
mov ah, 9 ; BuBog CTpoKu
int 21h   ; next geucTBue
 
jmp @@exit
 
@@below:
 
mov dx, menshe
mov ah, 9 ; BuBog CTpoKu
int 21h   ; next geucTBue
;vivod soobweniya menshe 
 
jmp @@exit
 
@@above:
mov dx, bolshe
mov ah, 9 ; BuBog CTpoKu
int 21h   ; next geucTBue
;vivod soobweniya bolwe  
 
jmp @@exit
 
@@exit:
mov ah,08h
int 21h
 
mov ax, 4C00h
int 21h
 
 
 
GetBin:
 
mov dx, first
mov ah, 9
int 21h
 
mov cx,8 ; podgotovka peremennih
mov dx,0 ; dx - rezultat
 
m1:
push dx ; pryachem na vremya v stek 
mov ah,1 ; vvedem s klaviaturi 1 symbol
int 21h
pop dx ; vernem dx iz steka
shl dx,1 ; sdvinem na 1 bit 
cmp al,'1'
jnz m2
or dx,1 ; esli bil viden symbol 1 - ustanovim mladshiy bit
 
m2:
loop m1 ; konec cykla
 
int 21h   ; next geucTBue
 
 
 
 
GetHex:
 
mov dx, second
mov ah, 9
int 21h
 
mov ah,1 ; vvedem 1 symbol
int 21h
cmp al, 'a' ; a - malenkaya
jb m3
        
cmp al, 'f'
ja input_error
 
sub al,'a' + 0ah
jmp input_rezult
    
; analogichno dlya zaglavnoy
m3:
cmp al, 'A' ; A - bolshayaя
jb m4
        
cmp al, 'F'
ja input_error
 
sub al,'A' + 0ah
jmp input_rezult
 
m4:
; analogichno dlya cifr
 
cmp al, '0' ; 0 - null
jb input_rezult
        
cmp al, '9'
ja input_error
 
sub al,'0' + 0
jmp input_rezult
 
input_error: 
mov al,0
input_rezult:  
 
int 21h   ; next geucTBue
 
 
privet db "Rabotu vipolnil ili ne vipolnil :\$"
first db 13,10, "Vvedite chislo a v dvoichnoy forme:$"
second db 13,10, "Vvedite chislo b v 16richnoi forme:$" 
result db 13,10, "Vash resulatat:$"
bolshe  db 13,10, "a>b$"
menshe db 13,10, "a<b$"
ravno db 13,10, "a=b$"
0
Модератор
Эксперт по электронике
8477 / 4335 / 1643
Регистрация: 01.02.2015
Сообщений: 13,462
Записей в блоге: 8
10.11.2019, 19:19 14
Оформление процедуры
Assembler
1
2
3
Getbin:
........
ret
или
Assembler
1
2
3
4
GetBin proc
........
ret
GetBin endp
А у вас из процедуры нет возврата - нет ret
0
4 / 4 / 0
Регистрация: 24.12.2014
Сообщений: 31
10.11.2019, 19:26  [ТС] 15
ФедосеевПавел, а теперь правильно?
Почему-то результат получается не верный.
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
use16
org 0x100
 
a db ?
b db ?
 
mov dx, privet
mov ah, 9 ; BuBog CTpoKu
int 21h   ; next geucTBue
 
call GetBin
mov [a], al
 
call GetHex
mov [b], al
 
mov dx, result
mov ah, 9
int 21h
 
mov al, [a]
cmp al, [b]
 
jb @@below
ja @@above
 
mov dx, ravno
mov ah, 9 ; BuBog CTpoKu
int 21h   ; next geucTBue
 
jmp @@exit
 
@@below:
 
mov dx, menshe
mov ah, 9 ; BuBog CTpoKu
int 21h   ; next geucTBue
;vivod soobweniya menshe 
 
jmp @@exit
 
@@above:
mov dx, bolshe
mov ah, 9 ; BuBog CTpoKu
int 21h   ; next geucTBue
;vivod soobweniya bolwe  
 
jmp @@exit
 
@@exit:
mov ah,08h
int 21h
 
mov ax, 4C00h
int 21h
 
 
 
GetBin:
 
mov dx, first
mov ah, 9
int 21h
 
mov cx,4 ; podgotovka peremennih
mov dx,0 ; dx - rezultat
 
m1:
push dx ; pryachem na vremya v stek 
mov ah,1 ; vvedem s klaviaturi 1 symbol
int 21h
pop dx ; vernem dx iz steka
shl dx,1 ; sdvinem na 1 bit 
cmp al,'1'
jnz m2
or dx,1 ; esli bil viden symbol 1 - ustanovim mladshiy bit
 
m2:
loop m1 ; konec cykla
 
ret
int 21h   ; next geucTBue
 
 
 
 
GetHex:
 
mov dx, second
mov ah, 9
int 21h
 
mov ah,1 ; vvedem 1 symbol
int 21h
cmp al, 'a' ; a - malenkaya
jb m3
        
cmp al, 'f'
ja input_error
 
sub al,'a' + 0ah
jmp input_rezult
    
; analogichno dlya zaglavnoy
m3:
cmp al, 'A' ; A - bolshayaÿ
jb m4
        
cmp al, 'F'
ja input_error
 
sub al,'A' + 0ah
jmp input_rezult
 
m4:
; analogichno dlya cifr
 
cmp al, '0' ; 0 - null
jb input_rezult
        
cmp al, '9'
ja input_error
 
sub al,'0' + 0
jmp input_rezult
 
input_error: 
mov al,0
input_rezult:  
 
ret
int 21h   ; next geucTBue
 
 
privet db "Rabotu vipolnil ya s pomoshyu=)$"
first db 13,10, "Vvedite chislo a v dvoichnoy forme:$"
second db 13,10, "Vvedite chislo b v 16richnoi forme:$" 
result db 13,10, "Vash resulatat:$"
bolshe  db 13,10, "a>b$"
menshe db 13,10, "a<b$"
ravno db 13,10, "a=b$"
Миниатюры
Ввести два числа, одно в двоичной форме, другое в шестнадцатеричной, сравнить их и вывести результат  
0
Модератор
Эксперт по электронике
8477 / 4335 / 1643
Регистрация: 01.02.2015
Сообщений: 13,462
Записей в блоге: 8
10.11.2019, 19:57 16
Мне кажется, что результат ввода из GetBin возвращается не через регистр al, а через другой.
К этому в строке 119 должно быть jb input_error - при вводе неправильного символа.

Добавлено через 1 минуту
emu8086 имеет возможность пошаговой отладки с просмотром переменных и регистров. Воспользуйтесь отладчиком - легче станет.
0
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
10.11.2019, 20:03 17
ФедосеевПавел, Low1keee, переделал под Эму, а то Вы ещё пару десятков сообщений добавите.
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
; You may customize this and other start-up templates; 
; The location of this template is c:\emu8086\inc\0_com_template.txt
 
org 100h
 
lea dx,db1st
mov di,2
call inpNum
mov dw1,ax
lea dx,db2nd
mov di,16
call inpNum
lea dx,dbEqu
cmp ax,dw1
jz  @@01
lea dx,dbBig
ja  @@01
lea dx,dbLow
@@01:
mov ah,9
int 21h
xor ax,ax
int 16h
ret
inpNum:
mov ah,9
int 21h
xor bx,bx
IN1:
xor ax,ax
int 16h
cmp al,13
jz  IN3
mov ah,al
sub ah,'0'
cmp ah,10
jb  IN2
and al,11011111b
mov ah,al
sub ah,'7'
IN2:
mov dx,di
cmp ah,dl
jae IN1
push    ax
;int    29h
mov ah,0Eh
int 10h
pop ax
mov al,ah
and ax,0Fh
xchg    ax,bx
mul di
add bx,ax
jnc IN1
IN3:
mov ax,bx
ret
db1st   db  10,13,'Enter bin number:$'
db2nd   db  10,13,'Enter hex number:$'
dbEqu   db  10,13,'Bin = Hex$'
dbLow   db  10,13,'Bin > Hex$'
dbBig   db  10,13,'Bin < Hex$'
dw1 dw  ?
Всего универсальности эма 29-е прерывание не знает.
Int 29 - DOS 2+ - FAST CONSOLE OUTPUT
Миниатюры
Ввести два числа, одно в двоичной форме, другое в шестнадцатеричной, сравнить их и вывести результат  
1
4 / 4 / 0
Регистрация: 24.12.2014
Сообщений: 31
10.11.2019, 22:49  [ТС] 18
ФедосеевПавел, Так я и завис на вашем ответе под номером 16, если честно, я даже не знаю как правильно пользоваться отладчиком в emu.
Можно вас попросить дать еще какой-либо разжевывающий комментарий?
Constantin Cat, за готовый код для emu спасибо, но я действительно хотел бы сам тоже разобраться как это работает, хотя и дается с трудом(
0
Модератор
Эксперт по электронике
8477 / 4335 / 1643
Регистрация: 01.02.2015
Сообщений: 13,462
Записей в блоге: 8
10.11.2019, 23:03 19
Этот emu8086 - платная программа и поэтому у меня её нет и не будет. Поэтому советов по работе с отладчиком дать тоже не могу. Знаю только, что возможности имеются.
В состав emu8086 входит справка, в интернете натыкался на переводы справки. Но интуитивно должно быть и так понятно.

Да и глазами сделайте анализ работы программы.
Первое число из процедуры ожидается в al
Assembler
1
2
call GetBin
mov [a], al
но из GetBin результат возвращается в другом регистре
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
GetBin:
 
mov dx, first
mov ah, 9
int 21h
 
mov cx,4 ; podgotovka peremennih
mov dx,0 ; dx - rezultat
 
m1:
push dx ; pryachem na vremya v stek 
mov ah,1 ; vvedem s klaviaturi 1 symbol
int 21h
pop dx ; vernem dx iz steka
shl dx,1 ; sdvinem na 1 bit 
cmp al,'1'
jnz m2
or dx,1 ; esli bil viden symbol 1 - ustanovim mladshiy bit
 
m2:
loop m1 ; konec cykla
 
ret
Подумайте - в каком.

Если не можете - берите готовый код Constantin Cat и ложитесь спать.

Я могу подсказать, но это равносильно взятию кода Constantin Cat.
1
4 / 4 / 0
Регистрация: 24.12.2014
Сообщений: 31
10.11.2019, 23:16  [ТС] 20
ФедосеевПавел, Если он возвращается в регистре ah, то я уже все перепробовал(или нет!?), исходя из этого ищу что-то другое, но ничего не приходит в голову пока.
Брать готовый код не буду, мне не так срочно), а вот спать идти действительно пора, живу +1 от мск, а завтра на работу(точнее уже сегодня)
Завтра вечером подумаю еще.
Спасибо за ответы.
0
10.11.2019, 23:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.11.2019, 23:16
Помогаю со студенческими работами здесь

Сравнить два целых числа, вывести результат
Дорогие форумчане, еще один вопрос на сегодня. Признателен Вам. Задача. Ввод двух целых чисел....

Ввести два одноразрядных положительных целых числа. Вывести на экран сумму ведённых чисел в двоичной системе счисления
Ввести с клавиатуры два одноразрядных положительных целых числа. Вывести на экран сумму ведённых...

Сравнить два целых числа и вывести результат сравнения в виде одного из знаков: >, < или =
Задача 10. Написать программу, содержащую функцию, которая сравнивает два целых числа и возвращает...

Даны два числа: одно размером dd, другое dw. Сложить эти числа
Дана задачка на ассемблере помогите сделать, а то совсем не шарю Даны два числа одно размером -...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru