Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2016, 09:57   #1
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию Вычисление на Assembler'e

Написать программу вычисление произведение 1723893618 * 6, используя для обеих множителей и результата представление десятичных чисел в ASCII- формате.
Буду очень благодарен за код с комментариями, так как с ассемблером проблемы и очень хочу разобраться для себя
Max00766 вне форума Ответить с цитированием
Старый 15.05.2016, 10:37   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Max00766
Скелет программы есть? Что именно не получается?
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 15.05.2016, 15:15   #3
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Написал такой код:
Код:
.model small 
.stack 256 
 
.data 
a dw 1723893618
b dw 6
c dw ?
 
.code 
Start: 
    mov ax, [a]
    mov bx, [b]
    mul bx
    mov [c], ax
 
 end Start
При компиляции выдает ошибку value out of range, понимаю что число не влазит в тип, но когда пишу dt тоже не работает выдает в 11 строке Operand types do not much
И как организовать вывод результата?
Max00766 вне форума Ответить с цитированием
Старый 15.05.2016, 15:15   #4
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Написал такой код:
Код:
.model small 
.stack 256 
 
.data 
a dw 1723893618
b dw 6
c dw ?
 
.code 
Start: 
    mov ax, [a]
    mov bx, [b]
    mul bx
    mov [c], ax
 
 end Start
При компиляции выдает ошибку value out of range, понимаю что число не влазит в тип, но когда пишу dt тоже не работает выдает в 11 строке Operand types do not much
И как организовать вывод результата?
Max00766 вне форума Ответить с цитированием
Старый 15.05.2016, 16:31   #5
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Max00766, ты неправильный взял старт. Вспомни умножение столбиком.
Возьмём твои числа: 1723893618 * 6

1. Начинаем справа-налево
2. Умножить 8 на 6 = 48. 8 записывай, 4 запоминай
3. Умножить 1 на 6 = 6. Прибавить к 6-ти 4. Нуль записывай, 1 запоминай..
4. Умножить 6 на 6 = 36. Прибавить к 6-ти 1. 7 записывай, 3 запоминай
5. и т.д.

Как видишь, нужны 2 операции: умножение и сложение..
На словах всё сложно, а в циклическом коде - всё элементарно.
Чтоб удобно было выводить числа на консоль, удобно сохранять/записывать числа в стек. Когда будешь извлекать их от туда, то получится "первым пришёл, последним уйдёт"
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 15.05.2016, 17:12   #6
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
Max00766, ты неправильный взял старт. Вспомни умножение столбиком.
Возьмём твои числа: 1723893618 * 6

1. Начинаем справа-налево
2. Умножить 8 на 6 = 48. 8 записывай, 4 запоминай
3. Умножить 1 на 6 = 6. Прибавить к 6-ти 4. Нуль записывай, 1 запоминай..
4. Умножить 6 на 6 = 36. Прибавить к 6-ти 1. 7 записывай, 3 запоминай
5. и т.д.

Как видишь, нужны 2 операции: умножение и сложение..
На словах всё сложно, а в циклическом коде - всё элементарно.
Чтоб удобно было выводить числа на консоль, удобно сохранять/записывать числа в стек. Когда будешь извлекать их от туда, то получится "первым пришёл, последним уйдёт"
Написал такое, но все равно проблемы с типами, не подскажите как исправить?
Код:
.286
.model small
.data
num1    dd 1723893618	
num2    dw 6
result  dd ?
.code
start:  mov ax,@data
    mov ds,ax
    mov ax,num1
    mul num2
    mov word ptr result,ax
    mov word ptr result+2,dx
    db 66h
    mov bx,10
    dw 0
    xor cx,cx
    db 66h
    mov ax,word ptr result
a0: 
    db 66h
    xor dx,dx
    db 66h
        div bx
    push dx
    inc cx
    db 66h
    test ax,ax
    jnz a0
a1: pop ax
    add al,'0'
    int 29h
    loop a1
    mov ah,0
    int 16h
exit:   mov ah,4Ch 
        int 21h 
end start
Max00766 вне форума Ответить с цитированием
Старый 15.05.2016, 18:37   #7
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Max00766 Посмотреть сообщение
Код:
.data
num1    dd 1723893618	
num2    dw 6
result  dd ?
.code
start:  
    mov ax,num1
    mul num2
    mov word ptr result,ax
    mov word ptr result+2,dx
..во-первых у тебя должна быть ASCII-строка, а не числа:
Код:
num1    db  '1723893618'
num2    db  '6'
..во-вторых ты опять берёшь числа слева-направо.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 15.05.2016, 18:39   #8
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Вот тебе фасмовский код.
Потрассируй его в отладчике и посмотри, что там происходит:

Код:
;== FASM code =======================
org 100h
jmp start

mes0   db  13,10,'Chislo(1):  $'
mes1   db  13,10,'Chislo(2):  $'
mes2   db  13,10,'   Rezult:  $'
buff   db  12 dup('0')        ; место под число
dig2   db  0                  ;   ..и под множитель

start:
      mov   dx,mes0           ;
      call  message           ;
      xor   bx,bx             ; счётчик разрядов числа
      mov   cx,10             ; макс.кол-во разрядов
@@1:  xor   ax,ax             ; ввод без эхо
      int   16h               ;
      cmp   al,13             ; Enter заканчивает ввод
      je    @@2               ;
      cmp   al,'0'            ; ингорируем всё,
      jb    @@1               ;      ..кроме чисел 0-9
      cmp   al,'9'            ;
      ja    @@1               ;
      int   29h               ; выводим ASCII-код числа на экран
      push  ax                ; сохраняем его в стеке
      inc   bx                ; считаем разряды
      loop  @@1               ; на повтор..

@@2:  mov   cx,bx             ; делаем СХ счётчиком для LOOP
      mov   di,buff+11        ; DI - приёмник. Прыгаем в конец буфера
      std                     ; ставим обратный шаг (DF=1)
save: pop   ax                ; снимаем числа в обратном порядке
      stosb                   ;  ..и сохраняем их в буфере справа-налево
      loop  save              ; мотаем цикл СХ-раз..

; Имеем: строку из 12-ти чисел в буфере,
; Левая часть буфера у нас забита нулями.
;-------------------------------------------------------------
      mov   dx,mes1           ; вводим множитель..
      call  message           ;
@@3:  mov   ah,8              ; ..без эхо
      int   21h               ;
      cmp   al,'0'            ; ингорируем всё,
      jb    @@3               ;      ..кроме чисел 0-9
      cmp   al,'9'            ;
      ja    @@3               ;
      int   29h               ; выводим символ на консоль
      and   al,0fh            ; переведём его в число
      mov   [dig2],al         ;      ..и запомним

; ASCII-умножение.
; Нужны операции: MUL/ADD/AAM/PUSH
; Множитель в ВL, перенос будем сохранять в BH
;-------------------------------------------------------------
      mov   dx,mes2           ;
      call  message           ;
      std                     ; обратный шаг
      mov   cx,12             ; цикл (учитывая возможный перенос)
      mov   si,buff+11        ; источник: крайний-правый символ
      xor   bx,bx             ; сбрасываем перенос
      mov   bl,[dig2]         ; множитель
mix:  lodsb                   ; берём байт из SI (si=si-1)
      and   ax,0fh            ; переводим символ в цифру
      xor   dx,dx             ;     (взводим флаги)
      mul   bl                ; перемножить байты
      aam                     ; ASCII коррекция. AL=число, AH=перенос
      add   al,bh             ; сложить число с переносом
      cmp   al,9              ; BCD-коррекция
      jbe   @@4               ; ^
      sub   al,0Ah            ; ^
      inc   ah                ; ^
@@4:  push  ax                ; запомним результат
      mov   bh,ah             ;     ..и перенос
      loop  mix               ; на повтор..

; В стеке получили результат.
; Выводим его на экран ---------------------------------------
      mov   cx,12             ;
prn:  pop   ax                ;
      or    al,30h            ; переводим число в символ
      int   29h               ; выводим его на консоль
      loop  prn               ;
;-------------------------------------------------------------
exit:                         ;
      xor   ax,ax             ;
      int   16h               ;
      int   20h               ;

;ннннннннннннннннн П Р О Ц Е Д У Р Ы нннннннннннннннннннннннннннннннннннн
;------------------------------------------------------------------------
message:                      ;
      mov   ah,9              ; вывод строки на экран
      int   21h               ;
ret                           ;
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 15.05.2016, 19:45   #9
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
Вот тебе фасмовский код.
Потрассируй его в отладчике и посмотри, что там происходит:

Код:
;== FASM code =======================
org 100h
jmp start

mes0   db  13,10,'Chislo(1):  $'
mes1   db  13,10,'Chislo(2):  $'
mes2   db  13,10,'   Rezult:  $'
buff   db  12 dup('0')        ; место под число
dig2   db  0                  ;   ..и под множитель

start:
      mov   dx,mes0           ;
      call  message           ;
      xor   bx,bx             ; счётчик разрядов числа
      mov   cx,10             ; макс.кол-во разрядов
@@1:  xor   ax,ax             ; ввод без эхо
      int   16h               ;
      cmp   al,13             ; Enter заканчивает ввод
      je    @@2               ;
      cmp   al,'0'            ; ингорируем всё,
      jb    @@1               ;      ..кроме чисел 0-9
      cmp   al,'9'            ;
      ja    @@1               ;
      int   29h               ; выводим ASCII-код числа на экран
      push  ax                ; сохраняем его в стеке
      inc   bx                ; считаем разряды
      loop  @@1               ; на повтор..

@@2:  mov   cx,bx             ; делаем СХ счётчиком для LOOP
      mov   di,buff+11        ; DI - приёмник. Прыгаем в конец буфера
      std                     ; ставим обратный шаг (DF=1)
save: pop   ax                ; снимаем числа в обратном порядке
      stosb                   ;  ..и сохраняем их в буфере справа-налево
      loop  save              ; мотаем цикл СХ-раз..

; Имеем: строку из 12-ти чисел в буфере,
; Левая часть буфера у нас забита нулями.
;-------------------------------------------------------------
      mov   dx,mes1           ; вводим множитель..
      call  message           ;
@@3:  mov   ah,8              ; ..без эхо
      int   21h               ;
      cmp   al,'0'            ; ингорируем всё,
      jb    @@3               ;      ..кроме чисел 0-9
      cmp   al,'9'            ;
      ja    @@3               ;
      int   29h               ; выводим символ на консоль
      and   al,0fh            ; переведём его в число
      mov   [dig2],al         ;      ..и запомним

; ASCII-умножение.
; Нужны операции: MUL/ADD/AAM/PUSH
; Множитель в ВL, перенос будем сохранять в BH
;-------------------------------------------------------------
      mov   dx,mes2           ;
      call  message           ;
      std                     ; обратный шаг
      mov   cx,12             ; цикл (учитывая возможный перенос)
      mov   si,buff+11        ; источник: крайний-правый символ
      xor   bx,bx             ; сбрасываем перенос
      mov   bl,[dig2]         ; множитель
mix:  lodsb                   ; берём байт из SI (si=si-1)
      and   ax,0fh            ; переводим символ в цифру
      xor   dx,dx             ;     (взводим флаги)
      mul   bl                ; перемножить байты
      aam                     ; ASCII коррекция. AL=число, AH=перенос
      add   al,bh             ; сложить число с переносом
      cmp   al,9              ; BCD-коррекция
      jbe   @@4               ; ^
      sub   al,0Ah            ; ^
      inc   ah                ; ^
@@4:  push  ax                ; запомним результат
      mov   bh,ah             ;     ..и перенос
      loop  mix               ; на повтор..

; В стеке получили результат.
; Выводим его на экран ---------------------------------------
      mov   cx,12             ;
prn:  pop   ax                ;
      or    al,30h            ; переводим число в символ
      int   29h               ; выводим его на консоль
      loop  prn               ;
;-------------------------------------------------------------
exit:                         ;
      xor   ax,ax             ;
      int   16h               ;
      int   20h               ;

;ннннннннннннннннн П Р О Ц Е Д У Р Ы нннннннннннннннннннннннннннннннннннн
;------------------------------------------------------------------------
message:                      ;
      mov   ah,9              ; вывод строки на экран
      int   21h               ;
ret                           ;
Огромное спасибо и здесь)
Max00766 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
4 трудных задачи на вычисление и нахождение ... (Assembler) metqqq Помощь студентам 11 29.06.2013 00:55
Assembler(Вычисление значений выражения) Ric Помощь студентам 0 06.04.2012 20:44
вычисление формулы (assembler) Cas01 Помощь студентам 0 29.02.2012 19:25
Вычисление формулы (assembler) lordofdeath Помощь студентам 0 01.12.2011 12:25
Вычисление функции (assembler, masm) Alex Eagle Помощь студентам 0 26.04.2009 15:16