Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
lexis
18 / 18 / 6
Регистрация: 26.03.2012
Сообщений: 130
Записей в блоге: 2
1

Записать два hex-числа, выполнить простейшую математическую операцию, вывести результат на экран

01.02.2015, 11:59. Просмотров 2891. Ответов 24
Метки нет (Все метки)

Написать программу:
Записать два 16-ых числа, выполнить простейшую математическую операцию, вывести результат на экран.


Если можно с комментариями, помогите начинающему...

Добавлено через 10 минут
Assembler
1
2
3
4
5
6
mov ax,0a5h
mov bx,0f2h
add ax,bx
sub ax,bx
mov ah, 04Ch
int 21h
Верно ли я пишу?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2015, 11:59
Ответы с готовыми решениями:

Ввести два числа плюс операцию и выполнить операцию
помогите плиз) 2.Вводятся с клавиатуры вещественное число X типа long, и Y типа float и символ K$....

Как выполнить операцию умножение между двумя ячейками одной таблицы и записать результат в ячейку?
а вы случайно не знаете как выполнить операцию умножение между двумя ячейками одной таблицы и...

Пытаюсь выПолнить простейшую операцию с Instr, и она выдает ошибку
Пытаюсь выаолнить простейшую операцию с Instr, и она выдает ошибку- ругается на параметр который...

Ввести два числа и выполнить указанную операцию
2. Цифры 1, 2, 3 и 4 обозначают операции сложение, умножение, вычитание и деление. Предложить...

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

24
Sergio Leone
2496 / 1118 / 580
Регистрация: 07.06.2014
Сообщений: 3,259
01.02.2015, 13:17 2
Цитата Сообщение от lexis Посмотреть сообщение
Верно ли я пишу?
ну, в принципе - да.

только.

1)
Цитата Сообщение от lexis Посмотреть сообщение
Assembler
1
mov ah, 04Ch
для выхода лучше заполнять и регистр AL нулём (это код завершения программы).
так, например:
Assembler
1
2
  mov ax,4C00h
  int 21h ; завершение программы с кодом 0
2)
Цитата Сообщение от lexis Посмотреть сообщение
Assembler
1
2
add ax,bx
sub ax,bx
Вы не поверите, но если к одному числу прибавить какое-то число, а замет, к от полученной суммы отнять это же число, что прибавляли, то получится исходное число (переполнение не берём во внимание).
Поэтому, лучше Вам оставить только одно из данных действий...


3)
Цитата Сообщение от lexis Посмотреть сообщение
вывести результат на экран.
вывода результата у Вас в коде, разумеется, нет. В форуме найдите готовый код вывода и используйте его.
1
lexis
18 / 18 / 6
Регистрация: 26.03.2012
Сообщений: 130
Записей в блоге: 2
01.02.2015, 13:49  [ТС] 3
А как тогда сделать сложение, потом вычитание, умножение и деление?, метками можно как-то отделить эти действия? и ещё по-поводу ввода hex чисел с клавиатуры, какие типы данных посоветуйте и как с ними работать?

и вообще можете посоветовать учебник, где об этом всё подробно описано, без воды.
0
Sergio Leone
2496 / 1118 / 580
Регистрация: 07.06.2014
Сообщений: 3,259
01.02.2015, 17:12 4
Цитата Сообщение от lexis Посмотреть сообщение
А как тогда сделать сложение, потом вычитание,
складывать и затем вычитать одно и тоже число вполне можно, только бессмыслено.
попробуйте решить уравнение x + y - y
чему, например, будет равно значение при x = 100, а y = 50 ?
а чему, например, будет равно значение при x = 100, а y = 150 ?

что же касается умножения и деления - то поищите в данном разделе, примеров вычисления простейших арифметических выражения вида A*B+C-D тут не мало. При делении учтите, что простая арифметика имеет дело с целыми числами (деление целочисленное). Если нужно работать с вещественными числами - то это совсем другой компот!


Цитата Сообщение от lexis Посмотреть сообщение
и ещё по-поводу ввода hex чисел с клавиатуры
ввод с клавиатуры?
Так, боюсь, что придётся вводить СТРОКУ (см. 10 функцию 21 прерывания):
Assembler
1
2
3
    mov ah, 0Ah 
    mov dx,offset BufferStr  ( или можно lea dx, BufferStr)
    int 21h
только учтите, что первые два байта BufferStr - служебные, первый байт буфера для ввода содержит значение, означающее максимально допустимое число символовов в вводимой строке, должно быть задано в начале,
второй байт прописывает функция - там число байт, фактически введённых пользователем.
потом полученную строку нужно будет преобразовать в числовое значение (перевести из строкового представление в число).


Цитата Сообщение от lexis Посмотреть сообщение
и вообще можете посоветовать учебник, где об этом всё подробно описано, без воды.
очень рекомендую электронный учебник от Mikl___ : http://www.cyberforum.ru/assembler-articles/thread1005284.html
1
01.02.2015, 17:12
lexis
18 / 18 / 6
Регистрация: 26.03.2012
Сообщений: 130
Записей в блоге: 2
03.02.2015, 13:21  [ТС] 5
Блин, не нашёл на форуме вывод результата после проделанной операции...

Прочитал учебники Юрова, одна каша...про шестнадцатеричные числа написано только то, как их складывать, вычитать столбиком, делить, умножать..., а по-поводу: в какие регистры их записывать в коде, и как рассчитывать и выводить не описано вообще...

Учебник Микла прочитал, не особо понял...

Скиньте код вывода результата на экран...,пожалуйста.

Добавлено через 12 минут
mov ah,9 ; функция DOS вывода сообщения
int 21h


?

или как

в какой регистр мне положить результат... в dx?

Добавлено через 2 минуты
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
;----------------------------------------
masm                    ;режим работы TASM: ideal или masm
model   small           ;модель памяти
.data                   ;сегмент данных
message db      'Введите две шестнадцатеричные цифры,$'
.stack                  ;сегмент стека
db      256     dup ('?')       ;сегмент стека
.code                   ;сегмент кода
main    proc            ;начало процедуры main
mov     ax,@data        ;заносим адрес сегмента
   ;данных в регистр ax
mov     ds,ax   ;ax в ds
;далее текст программы (см. сегмента кода в листинге 3.1 книги)
mov     ax,4c00h        ;пересылка 4c00h в регистр ax
int     21h             ;вызов прерывания с номером 21h
main    endp            ;конец процедуры main
end     main            ;конец программы с точкой входа main
0
Charles Kludge
Клюг
7654 / 3169 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
03.02.2015, 13:30 6
Ввод/вывод шестнадцатеричных чисел.
0
lexis
18 / 18 / 6
Регистрация: 26.03.2012
Сообщений: 130
Записей в блоге: 2
03.02.2015, 16:50  [ТС] 7
очень много букв...

Дело в том, что препод мне не поверит, что это написано лично мною, Скажет: Петя, в книжке Юрова о таком не написано, есть ли упрощенный вариант вывода?
т.е. положить в регистр и вывести его на экран?

В С printf("Результат, Result);

а в ассемблере как... по-проще?

Добавлено через 2 часа 49 минут
raov это что за команда, загуглил, не особо понял
0
Charles Kludge
Клюг
7654 / 3169 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
03.02.2015, 17:21 8
Цитата Сообщение от lexis Посмотреть сообщение
как... по-проще?
Выводим байт из AL:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
;FASM
    org 100h
    mov al, 0C5h
    call    _hex
    ret
_hex:   aam 10h
    or  ax, '00'
    call    @1
@1: xchg    ah, al
    cmp al, '9'
    jbe @2
    add al, 7
@2: int 29h
    ret
1
Argogo
03.02.2015, 19:00
  #9

Не по теме:

Charles Kludge, и тут препод ему поверит, что это он сам написал, ага.

0
Charles Kludge
03.02.2015, 19:07
  #10

Не по теме:

Argogo, мне читали Фортран IV, а писючий асм я изучал сам, так что хз.

0
lexis
18 / 18 / 6
Регистрация: 26.03.2012
Сообщений: 130
Записей в блоге: 2
05.02.2015, 11:50  [ТС] 11
0
Charles Kludge
Клюг
7654 / 3169 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
05.02.2015, 14:23 12
Цитата Сообщение от lexis Посмотреть сообщение
raov это что за команда
Я тоже такой не знаю.
0
lexis
18 / 18 / 6
Регистрация: 26.03.2012
Сообщений: 130
Записей в блоге: 2
05.02.2015, 15:38  [ТС] 13
Всё же не понимаю я как реализовать поочерёдно:сложение, умножение, деление, вычитание.


т.е. объявим 3 переменные

a,b,c где c - результат

a=значение
b=значение

с=a+b

pritf('Сложение',c)
c=0
________________

c=a-b
pritf('Вычитание',c)
c=0
________________
c=a*b
pritf('Умножение',c)
c=0
_______________
c=a/b
pritf('Деление',c)
c=0



Блин, ну не понимаю я как работать с регистрами...

Прочитал Калашникова, Юрова, Пирогова, ну нет примеров работы с 16-чными числами!!!

Добавлено через 5 минут
Цитата Сообщение от Charles Kludge Посмотреть сообщение
;FASM org 100h mov al, 0C5h call _hex ret _hex: aam 10h or ax, '00' call @1 @1: xchg ah, al cmp al, '9' jbe @2 add al, 7 @2: int 29h ret

Тут сравнивается строка с символами 0-9 и a-f(10-15)?
0
Charles Kludge
Клюг
7654 / 3169 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
05.02.2015, 15:42 14
Цитата Сообщение от lexis Посмотреть сообщение
Тут сравнивается строка с символами
Да, с символами "0"-"9"(30h-39h) и "A"-"F"(41h-46h).
1
lexis
18 / 18 / 6
Регистрация: 26.03.2012
Сообщений: 130
Записей в блоге: 2
05.02.2015, 17:12  [ТС] 15
Можешь помочь с построением ввода 2 16-чных значений... затем поочерёдно выполнять операции над ними: сложения, вычитания,умножения, деления, а затем уже вывод, боюсь то, что я написал в 1 посте это не то...



После компиляциии происходит вывод сообщения на экран о вводе 16чного значения, после ввода значения ничего не происходит

masm
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
model small
.data                    ;сегмент данных
message    db      "Введите две шестнадцатеричные цифры,$"
tabl       db      48 dup (0),0,1,2,3,4,5,6,7,8,9, 7 dup (0)
           db      0ah,0bh,0ch,0eh,0dh,0fh,27 dup (0)
           db      0ah,0bh,0ch,0dh,0eh,0fh, 153 dup (0)
.stack     256     ;сегмент стека
.code
;начало сегмента кода
    main proc   ;начало процедуры main
    mov     ax,@data        ;физический адрес сегмента данных в регистр ax
    mov     ds,ax   ;ax записываем в ds
    lea       bx,tabl ;загрузка адреса строки байт в регистр bx
    mov     ah,9
    mov     dx,offset message
    int       21h     ;вывести приглашение к вводу
    xor      ax,ax  ;очистить регистр ax
    mov     ah,1h ;значение 1h в регистр ah
    int       21h     ;вводим первую цифру в al
    xlat                ;перекодировка первого введенного символа в al
    mov     dl,al
    shl       dl,4    ;сдвиг dl влево для освобождения места для младшей цифры
    int       21h     ;ввод второго символа в al
   xlat                ;перекодировка второго введенного символа в al
    add     al,dl   ;складываем для получения результата
    mov     ax,4c00h        ;пересылка 4c00h в регистр ax
    int       21h     ;завершение программы
endp  main    ;конец процедуры main
end main    ;конец программы с точкой входа main
0
lexis
18 / 18 / 6
Регистрация: 26.03.2012
Сообщений: 130
Записей в блоге: 2
07.02.2015, 15:49  [ТС] 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
; masm dos exe #
.286
.MODEL small
.STACK 100h
.DATA 
Str1 DB 5,?,5 Dup(?)
Str2 db 0Dh,0Ah,"Введи первое шестнадцатеричное число не больше 4 цифр и нажми на Enter",0Dh,0Ah,"$"
StrRes DB 0Dh,0Ah,"Результат равен ",10 Dup('$')
Num1 DW 0
.CODE
start:  mov ax,3
    int 10h
    MOV AX, @data
    MOV DS, AX
    mov es,ax
    CALL ReadStr
    MOV Num1,AX
    MOV Num1+2,DX
    mov word ptr Str2+0-9,"тв"
    mov word ptr Str2+0-9,"ро"
    CALL ReadStr
    MUL Num1
    xchg ax,dx
    mov di,offset StrRes+18
    call BinToHex
    xchg ax,dx
    call BinToHex
    mov dx,offset StrRes
    MOV AH,9
    INT 21h
    mov ah,0
    int 16h
    MOV AH,4ch 
    INT 21h 
;----------------------------
ReadStr Proc
        mov dx,offset Str2
    MOV AH,9
    INT 21h
    MOV DX,offset Str1
    mov si,dx
    MOV AH,0Ah
    INT 21h
    add si,2
    xor cx,cx
    xor dx,dx
    MOV CL,Str1+1
    jcxz exit
    MOV AX,0
MulLoop:shl ax,4 
    MOV bl,[si]
    SUB bl,"0"
    cmp bl,9
    jbe a1
    and bx,11011111b
    sub bl,7
a1: ADD AX,BX
    INC si
    loop MulLoop
exit:   RET
ReadStr EndP
BinToHex Proc
    mov cx,2
@@: rol ax,8
    push ax
    shr al,4; работаем со старшей тетрадой
    call Hex2
        pop ax
        and al,0Fh; обнуляем старшую тетраду
    call Hex2; работаем с младшей тетрадой
    loop @b
    ret
BinToHex EndP
Hex2 proc
    add al,90h ;если в al была цифра 0..9, тогда в al
            ;будет 90h..99h, если в al была цифра 0Ah..0Fh,
           ;тогда в al будет 9Ah..9Fh
    daa         ; 0-9: 90h..99h CF=0
                 ; A-F: 00h..05h CF=1
    adc al,40h ; 0-9: D0h..D9h
                 ; A-F: 41h..46h
    daa       ; 0-9: 30h..39h
                 ; A-F: 41h..46h
    stosb      ; помещаем значение из AL в строку
    ret
Hex2 endp
end start

Нашёл программу, написанною миклом

Пробую компилировать, чтобы потом разобраться в отладчике, но ругается на строки 19,20, value out of range(значение за пределы диапазона)

Assembler
1
2
  mov word ptr Str2+8,"тв"
    mov word ptr Str2+10,"ро"
Пробовал удалять/менять значения Str2+8, ругается на Need Expression...

Добавлено через 12 минут
эх, это же замена букв в слове, только почему ругается..

Добавлено через 43 минуты
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
; masm dos exe #
.286
.MODEL small
.STACK 100h
.DATA 
Str1 DB 5,?,5 Dup(?)
Str2 db 0Dh,0Ah,"Vvedite 1-e 16 chislo",0Dh,0Ah,"$"
StrRes DB 0Dh,0Ah,"Rezultat raven =  ",10 Dup('$')
Num1 DW 0
.CODE
start:  
    MOV AX, @data
    MOV DS, AX
    mov es,ax
    CALL ReadStr
    MOV Num1,AX
    MOV Num1+2,DX
    mov word ptr Str2+10,"2"
    CALL ReadStr
    Mul Num1
    xchg ax,dx
    mov di,offset StrRes+20
    call BinToHex
    xchg ax,dx
    call BinToHex
    mov dx,offset StrRes
    MOV AH,9
    INT 21h
    mov ah,0
    int 16h
    MOV AH,4ch 
    INT 21h 
;----------------------------
ReadStr Proc
        mov dx,offset Str2
    MOV AH,9
    INT 21h
    MOV DX,offset Str1
    mov si,dx
    MOV AH,0Ah
    INT 21h
    add si,2
    xor cx,cx
    xor dx,dx
    MOV CL,Str1+1
    jcxz exit
    MOV AX,0
MulLoop:shl ax,4 
    MOV bl,[si]
    SUB bl,"0"
    cmp bl,9
    jbe a1
    and bx,11011111b
    sub bl,7
a1: ADD AX,BX
    INC si
    loop MulLoop
exit:   RET
ReadStr EndP
BinToHex Proc
    mov cx,2
@b: rol ax,8
    push ax
    shr al,4; работаем со старшей тетрадой
    call Hex2
        pop ax
        and al,0Fh; обнуляем старшую тетраду
    call Hex2; работаем с младшей тетрадой
    loop @b
    ret
BinToHex EndP
Hex2 proc
    add al,90h ;если в al была цифра 0..9, тогда в al
            ;будет 90h..99h, если в al была цифра 0Ah..0Fh,
           ;тогда в al будет 9Ah..9Fh
    daa         ; 0-9: 90h..99h CF=0
                 ; A-F: 00h..05h CF=1
    adc al,40h ; 0-9: D0h..D9h
                 ; A-F: 41h..46h
    daa       ; 0-9: 30h..39h
                 ; A-F: 41h..46h
    stosb      ; помещаем значение из AL в строку
    ret
Hex2 endp
end start

Сделал так, а вот насчёт операций сложение, вычитание, где это в коде поменять можно?

Добавлено через 9 минут
Assembler
1
2
3
4
5
6
7
8
9
10
MulLoop:shl ax,4 
    MOV bl,[si]
    SUB bl,"0"
    cmp bl,9
    jbe a1
    and bx,11011111b
    sub bl,7
a1: ADD AX,BX
    INC si
    loop MulLoop

Как заменить сложением,вычитанием, либо делением?

Добавлено через 1 час 18 минут
С делением понял, нужно просто заменить
Assembler
1
  Mul Num1
на
Assembler
1
  div Num1
Насчёт сложение, вычитание 16чных чисел

Нужны 2 переменные, пробую объявить Num2 , затем в коде прописываю add Num1,Num2 , компилятор ругается...

Добавлено через 5 часов 16 минут
Мозг не может вникнуть в эту кашу

Литература не помогает, либо читаю не то...Юров, Пирогов, всё равно не помогает особо.
0
Charles Kludge
Клюг
7654 / 3169 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
07.02.2015, 17:09 17
Цитата Сообщение от lexis Посмотреть сообщение
в коде прописываю add Num1,Num2 , компилятор ругается...
Конечно, ведь в этой рукожопой архитектуре операции память-память запрещены.
Assembler
1
2
    mov ax, [Num1]
    add [Num2], ax
Только так, ведь ноги современных процов растут из 8008.
1
lexis
18 / 18 / 6
Регистрация: 26.03.2012
Сообщений: 130
Записей в блоге: 2
07.02.2015, 17:26  [ТС] 18
Спасибо, проверю

Добавлено через 4 минуты
Попробовал вставить ваш код, не складывает, в результате вывод 00001234

Добавлено через 7 минут
Если 1 значение 1234, второе 1234, результат выдаёт 0001234
0
Charles Kludge
Клюг
7654 / 3169 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
07.02.2015, 17:28 19
А в отладчике смотрели, что в [Num2] получается?
0
lexis
18 / 18 / 6
Регистрация: 26.03.2012
Сообщений: 130
Записей в блоге: 2
07.02.2015, 17:41  [ТС] 20
ax затирается нулями...
0
07.02.2015, 17:41
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2015, 17:41

Запросить два числа и затем выполнить затребованную арифметическую операцию
Доброго времени суток! Помогите разобраться с проблемой. На данный момент читаю С. Прата - Язык...

Выполнить заданную арифметическую операцию, ответ вывести на экран
Запросить у пользователя значение переменной X (вещественная переменная) знак операции (символьная...

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


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

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

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