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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2017, 07:20   #1
Spherx
Новичок
Джуниор
 
Регистрация: 21.12.2017
Сообщений: 1
По умолчанию masm Умножение двух шестнадцатеричных чисел

Всем привет, ошибка в 19 строке, что делать?
Программа должна перемножить два шестнадцатеричных числа и вывести результат.
Код:
.586						; Набор инструкций
.model flat, stdcall		      ; Модель  памяти, модель вызова процедур              

_STACK  segment para stack          ; Cегмент начинается по адресу, кратному 16  
        db      1024 dup(?)
_STACK  ends
 
_DATA   segment
        A       db      07Fh
        B       db      0FAh
        Result  dw      ?
        CrLf    db      0Dh, 0Ah, '$'
_DATA   ends
 
_TEXT   segment
        assume  cs:_TEXT, ds:_DATA, ss:_STACK   ; Eзнает, какой сегментный регистр поставлен в соответствие этому сегменту
main    proc
        ;инициализация сегментного регистра данных
        mov     ax,     _DATA
        mov     ds,     ax
 
        mov     al,     [A]
        mov     bl,     [B]
        mul     bl                      ;ax=A*B
 
        ; Начинаем перевод числа AX в строку
        mov    cl,      ((16-1)/4)*4    ; 16-битный регистр, будем выводить по 4 бита (0..F)
        xchg   dx,      ax              ; Сохраняем число в DX
 
@@Repeat:
 
        mov    ax,      dx              ; Восстанавливаем число в AX
        shr    ax,      cl              ; Сдвигаем на CL бит вправо
        and    al,      0Fh             ; Получаем в AL цифру 0..15
        add    al,      '0'             ; Получаем в AL символ цифры
        cmp    al,      '9'             ; Проверяем цифру
        jbe    @@Digit09                ; Прыгаем, если это цифра 0..9
        add    al,      'A'-('9'+1)     ; Иначе (для A..F) корректируем ее
 
@@Digit09:
 
        int    29h                      ; Выводим символ в AL на экран
        sub    cl,      4               ; Уменьшаем CL на 4 для следующей цифры
        jnc    @@Repeat                 ; Если знаковый CL >= 0, то повторяем
 
        ;завершение программы
        mov     ax,     4C00h           ; Выводим результат
        int 21h                         ; Передаемм управление ДОС для выполнения фукнкции
main    endp
 
_TEXT   ends
 
        end     main

_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 21.12.2017 в 09:26.
Spherx вне форума Ответить с цитированием
Старый 21.12.2017, 09:39   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

чем компилируете?
увидел, masm

у меня старенький DOS'ский TASM (ver. 1.0 1988 год)
не понял первые две строчки. после их удаления всё скомпилировал за милую душу!

я не спец, но я бы для начала исправил строчку
Цитата:
Код:
_TEXT   segment
на
Код:
_TEXT segment 'code'

Последний раз редактировалось Serge_Bliznykov; 21.12.2017 в 09:47.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.12.2017, 10:12   #3
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
я бы для начала исправил строчку
Это тут совсем ни при чём.

Во-первых, нужно первые 2 строки поменять местами.
Во-вторых, модель FLAT используется в 32-64-битном коде в Windows (Linux и пр), а не в DOS.
Код:
.model small, stdcall
.586
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 21.12.2017, 10:43   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от 7in Посмотреть сообщение
Это тут совсем ни при чём.
верю. я же говорю, что я не спец.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.12.2017, 01:11   #5
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

7in здесь я чуток не согласен с тобой...
..я помню, как Serge_Bliznykov мне объяснял умножение и вывод на экран на асме -- это было что... Я классно помню этот разговор и применяю до сих пор его совет.

Даю ганартию, что этот человек знает намного больше меня, просто я потом пошёл по узкому профилю, а он знает всё, и обо всём. Приклоняю голову, как Сержу, так и нашему брату Микл'у. Ещё был терпиливый ко мне нито Стелс или как-то его звали. Потом он пропал.. У него была синяя лайба на "бэйджике". Он тоже капец рубил в этой теме.

Вроде эт год провели не плохо... Желаю того-же в наступающем.. ИМХО людей не бывает исключительных - у каждого есть свой косяк. Млин.. мнебы дай поговорить с единомышлениками.. Иногда выплёскиваю мысли в своих темах..

Никому не советую слушать попсу.. Капец корень меняет. Сам сейчас давно не обновлял фонотеку... Прикалываюсь по Мэрлин Мэнсону, и... а легче сделать скрин: (можно удалить эту хрень, просто хотелось сказать за Serge_Bliznykov, а вышло немного больше):
Изображения
Тип файла: jpg 01.JPG (11.4 Кб, 125 просмотров)
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 24.12.2017, 01:18   #6
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

7in по возможности дай ТС'у код без инклуд -- он тебя капец запомнит (если интересуется этой темой). Там-же ничего нового, просто тему поддержал ты...
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 24.12.2017, 09:02   #7
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
7in здесь я чуток не согласен с тобой...
Так, в чём именно-то?
Я же не говорю, что Серж чего-то не знает
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 24.12.2017, 23:04   #8
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Женя, зато ты знаешь,
У мене есть ...тека. пусть пацаны юзают
Код:

format PE console
entry start

include 'win32ax.inc'

section '.code' code readable executable
start:
    cinvoke printf, <"%d", 10, 0>, 76313
    invoke ExitProcess, 0

section '.idata' import data readable

library kernel32, 'kernel32.dll',\
	msvcrt, 'msvcrt.dll'

include 'api\kernel32.inc'

import msvcrt,\
       printf, 'printf'
;------------------------------------------------

buf db 128 dup (0)
fmt db '%08X',0
...
invoke wsptintf,addr buf,addr fmt,esi
invoke	MessageBox,HWND_DESKTOP,addr buf,'Заголовок',MB_ICONASTERISK
;------------------------------------------
;Assembler: FASM
;На входе: AX - исходное число
;Буфер для записи результата в ASCII - кадр стека
;Не портит никакие регистры
;Не портит флаги

OutU16:       ; Вывод 16-битного беззнакового числа из AX
pushf
pusha
enter 6,0
mov si,-1
mov byte [bp+si],'$'
mov bx,10
 @@:
 xor dx,dx
 div bx
 add dl,'0'
 dec si
 mov [bp+si],dl
 test ax,ax
 jnz @b
push ss
pop ds
lea dx,[bp+si]
mov ah,9
int 21h
leave
popa
popf
ret
-------------------------------------------------------------------
hex2asc:		 ; Функция переводит числа в символы
   pusha		 ; Вход:  АХ = число, BX = система счисления
   xor	 cx,cx		 ; Выход: на экране
isDiv:			 ;
   xor	 dx,dx		 ;
   div	 bx		 ;
   push  dx		 ;
   inc	 cx		 ;
   or	 ax,ax		 ;
   jnz	 isDiv		 ;
isOut:			 ;
   pop	 ax		 ;
   cmp	 al,9		 ;
   jle	 noHex		 ;
   add	 al,7		 ;
noHex:			 ;
   add	 al,30h 	 ;
   int	 29h		 ;
   loop  isOut		 ;
   popa 		 ;
ret			 ;
;===================================================================
asc2bin:		 ; Процедура переводит символы в числа
   xor	 cx,cx		 ; Вход:  ВХ = система счисления
   xor	 ax,ax		 ; Выход: АХ = число в указанной СС
nextDigit:		 ;
   mov	 ah,1		 ;
   int	 21h		 ;
   cmp	 al,13		 ;
   je	 @f		 ;
   and	 ax,0Fh 	 ; переводим символ в цифру
   xchg  ax,cx		 ; меняем последнее и ранее/введёное число
   xor	 dx,dx		 ; взводим флаги нуля и чётности
   mul	 bx		 ; умножаем AX на BX. Результат в АХ
   add	 cx,ax		 ; прибавляем его к DI. Теперь в DI введёное число
   jmp	 nextDigit	 ; следующий символ..
@@:			 ;
   mov	 ax,cx		 ;
ret
;-------------------------------------------------------------------
saveString:		 ; Ввод строки по адресу ES:DI
   xor	 cx,cx		 ; Длина строки в СХ
   mov	 ah,1		 ;
save:			 ;
   int	 21h		 ;
   cmp	 al,13		 ;
   je	 @f		 ;
   stosb		 ; сохраняем символ в буфере
   inc	 cx		 ; длина строки +1
   jmp	 save		 ; сл.символ..
@@:			 ;
ret
;-------------------------------------------------------------------
outHex: 		 ; процедура выводит на экран АХ в HEX
   xchg  dx,ax		 ; DX = AX
   mov	 cx,4		 ; число цифр для вывода
@@:			 ;
   shld  ax,dx,4	 ; получить в AL очередную цифру
   rol	 dx,4		 ; удалить ее из DX
   and	 al,0Fh 	 ; оставить в AL только эту цифру
   cmp	 al,0Ah 	 ; три команды, переводящие
   sbb	 al,69h 	 ;    ..шестнадцатеричную цифру в AL
   das			 ;         ..в соответствующий ASCII-код
   int	 29h		 ; вывод на экран
   loop  @b		 ; повторить для всех цифр
ret
;-------------------------------------------------------------------
outBin:
      mov   bl,al
      mov   cx,8
      mov   ah,2
@1:   mov   dl,'0'
      shl   bl,1
      jnc   okey
      inc   dl
okey: int   21h
      loop  @1
ret

;//=================== ПРОЦЕДУРА ВВОДА НЕХ ===================================|
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		     ; если заглавная буква, то остаток будет
   jbe	  @1		     ; ^^ ..в пределах(5). Ниже/равно - коррекция!
   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


printArray:		  ;
    lodsw		  ;
    or	  ax,ax    ;<-----; проверка на знак!
    jns   @f		  ; пропускаем положительные
    neg   ax		  ; инверсия отрицательных
    push  ax		  ;
    mov   al,'-'	  ;
    int   29h		  ; вставляем(-) спереди числа
    pop   ax		  ;
@@: mov   bx,10 	  ; выводить на экран будем в 10-тичном виде
    call  hex2asc	  ;
    mov   al,' '	  ; пробел-разделитель
    int   29h		  ;
    loop  printArray	  ; мотаем цикл СХ-раз..
ret
Нашедшего выход - затаптывают первым..

Последний раз редактировалось Serge_Bliznykov; 25.12.2017 в 10:32.
R71MT вне форума Ответить с цитированием
Старый 25.12.2017, 10:38   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

R71MT, 7in, спасибо.
Но в асме Вы знаете и умеете несравнимо больше, чем я.
и Mikl___ тоже большой Гуру в Асме.
это факт.

что же касается данной темы, то с masm/masm32 я практически не сталкивался.
поэтому и дал такой "пальцем в небо" совет.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++. пример на умножение двух однозначных чисел и проверка ответа пользователя. antik75 Помощь студентам 12 20.10.2016 18:02
Умножение двух чисел а в результате 0... xcripz Помощь студентам 4 17.10.2011 23:30
умножение двух двоичных чисел!!! 2008kedr2008 Общие вопросы C/C++ 1 12.05.2011 13:28
Умножение двух длинных целых чисел, представленных двунаправленными связанными списками Rifler Паскаль, Turbo Pascal, PascalABC.NET 0 28.05.2010 19:31
Умножение двух чисел в p-ичной системе счисления - turbo pascal oxygen2007rus Помощь студентам 1 13.12.2009 16:00