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

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

Вернуться   Форум программистов > Работа для программиста > Фриланс
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2017, 21:37   #1
Влад_+_
Пользователь
 
Регистрация: 22.12.2015
Сообщений: 10
По умолчанию Произведение двоичных чисел в ассемблере.Вывод в десятичной системе

.MODEL SMALL
.STACK 200H
.DATA
;Struktura chisel s fiksirovannoy zapyatoy
FIX STRUC
M DD 1
H DD 2
FIX ENDS
;**********************
; Segment dannykh
;**********************
TEXT1 DB "Ukazhite razmer massiva, ne bolee 16: ", 0
TEXT2 DB "Vvedite ", 0
TEXT3 DB " znachenie :", 0
TEXT4 DB "Vvedite indeksy elementov massiva dlya proizvedenia.", 0
TEXT5 DB "Indeks pervogo elementa: ", 0
TEXT6 DB "Indeks vtorogo elementa: ", 0
TEXT7 DB "Summa elementov ravna: ", 0
LEN DB 0
BUF DB 26, 26 DUP(0)
MAS FIX 16 DUP(<>) ;massiv struktur
.CODE
;----------------------
;Makros perevoda stroki
;----------------------
PUTLN MACRO
MOV AL, 13 ;V nachalo
CALL PUTC
MOV AL, 10 ;Na sleduyushchuyu stroku
CALL PUTC
ENDM
;==================================
;Podprogramma vyvoda AL na terminal
;==================================
PUTC PROC NEAR
PUSH DX
MOV DL, AL
MOV AH, 2
INT 21H
POP DX
RET
PUTC ENDP
;================================== =============
;Vyvod chisla v desyatichnom vormate iz registra AX
;================================== =============
PRINTD PROC NEAR
PUSH DX
PUSH CX

XOR CX, CX
XOR DX, DX

MOV BX, 8000H ;Starshyy bit
AND BX, AX
SHR BX, 15
CMP BX, 1
JNE @D0
MOV CH, 1 ;Flag znaka minus
NEG AX
@D0:
MOV BX, 10 ;Osnovanie
@D1:
DIV BX
PUSH DX
XOR DX, DX
INC CL ;Schetchik
CMP AX, 0
JNE @D1

CMP CH, 1
JNE @D2
MOV AL, 2DH
CALL PUTC
@D2:
;Tut nachinaetsya vyvod simvolov iz steka
POP DX
MOV AX, DX
ADD AL, 30H
CALL PUTC
DEC CL
CMP CL, 0
JNE @D2

POP CX
POP DX
RET
PRINTD ENDP
;==========================
;Vyvod stroki adresuemoy SI
;==========================
PRINTS PROC NEAR
@@L:
MOV AL, [SI]
CMP AL, 0FFH
JE @@R
CMP AL, 0
JZ @@R
CALL PUTC
INC SI
JMP SHORT @@L
@@R: RET
PRINTS ENDP
;================================== ==
;Bufernyy vvod stroki adresovannoy DX
;================================== ==
GETS PROC NEAR
PUSH SI
MOV SI, DX
MOV AH, 0AH
INT 21H
; Zapis' nulya v kontse stroki vmesto znaka perenosa karetki
XOR AX, AX
MOV AL, [SI+1]
ADD SI, AX
MOV BYTE PTR [SI+2], 0
POP SI
RET
GETS ENDP
;================================== =================================== ============================
;Protsedura izvlecheniya znacheniya desyatichnogo chisla iz buvera adresovannogo registrom SI V registr AL
;================================== =================================== ============================
VALUE PROC NEAR
ADD SI, 2
XOR AX, AX
MOV DH, 10
@V1:
MOV DL, BYTE PTR [SI]
INC SI
CMP DL, 0
JE @VEND
SUB DL, 30H
CMP DL, 10
JGE @V2
MUL DH
ADD AL, DL
JMP @V1
@V2:
MOV AL, 3FH
@VEND:
RET
VALUE ENDP
;================================== =================================== ====================
;Protsedura dobavleniya v massiv znacheniya ikh bufera, v sluchae uspekha umen'shaetsya znachenie CX
;================================== =================================== ====================
PUTMAS PROC NEAR
PUSH SI

LEA SI, TEXT2
CALL PRINTS
MOV AX, CX ;Vyvod chisla
CALL PRINTD
LEA SI, TEXT3
CALL PRINTS
LEA DX, BUF
CALL GETS
PUTLN

;Tut nuzhno obrabotat' dannye v bufere
LEA SI, BUF
ADD SI, 2
XOR DX, DX
XOR AX, AX
MOV BL, 13 ;Razmer mantisy + znak "e"
MOV BH, 25

LODSB
CMP AL, 2DH ;Proverka na minus
JE @P1
CMP AL, 2BH
JE @P3
CMP AL, 30H
JE @P2
CMP AL, 31H
JE @P2
JMP @PER
@P1:
MOV AH, 1 ;Flag oznachayushchiy znak minus
JMP @P3
@P2:
SHL DX, 1
SUB AL, 30H
ADD DL, AL
DEC BL
@P3:
CMP BL, 0 ;mantisa bol'she 35
JE @PER
LODSB
CMP AL, 30H
JE @P2
CMP AL, 31H
JE @P2
CMP AL, 65H ;Simvol "e"
JNE @PER
CMP BL, 35 ;Proverka A ne slishkom rano idet "e"
JE @PER
;Na etot moment mantisa schitana v DX
PUSH DX
XOR DX, DX
JMP @P5
@P4:
CMP BH, 0
JE @PER0

SHL DX, 1
SUB AL, 30H
ADD DL, AL
DEC BH
@P5:
LODSB
CMP AL, 30H
JE @P4
CMP AL, 31H
JE @P4
CMP AL, 0
JNE @PER0

;Tut izvestna kharakteristika
POP BX ;Tut mantisa
POP SI ;Tut adress massiva
CMP AH, 1
JNE @P6
NEG BX
@P6:
MOV WORD PTR [SI].M, BX
MOV WORD PTR [SI].H, DX
MOV AX, TYPE FIX
ADD SI, AX ;
INC CX
JMP @PEND
;Vykhod s oshibkoy
@PER0:
POP DX
@PER:
POP SI
@PEND:
RET
PUTMAS ENDP
;################################## ######
BEGIN:
MOV AX, @DATA
MOV DS, AX
MOV ES, AX
XOR AX, AX

@B1:
LEA SI, TEXT1
CALL PRINTS

LEA DX, BUF
CALL GETS
PUTLN
;Zaprashivaem razmer massiva
LEA SI, BUF
CALL VALUE
CMP AL, 3FH ;kod simvola voprosa
JE @B1
CMP AL, 16
JG @B1
;nachinaem vvod dannykh
MOV BYTE PTR LEN, AL
MOV CX, 0 ; Schetchik
LEA SI, MAS
@B2:
CALL PUTMAS
XOR AX, AX
MOV AL, BYTE PTR LEN
CMP CX, AX
JL @B2
PUTLN

;TUT MY Vveli massiv, teper' nuzhno zaprosit' indeksy, proverit' na korrektnost', schitat' elementy massiva,
;sravnit' ikh kharakteristiki, privesti k obshchemu znacheniyu izmenyaya mantisu, vypolnit' slozhenie)
MOV BL, BYTE PTR LEN
LEA SI, TEXT4
CALL PRINTS
PUTLN
@B3:
LEA SI, TEXT5
CALL PRINTS
LEA DX, BUF
CALL GETS
PUTLN
LEA SI, BUF
CALL VALUE
CMP AL, 3FH
JE @B3
CMP AL, BL
JGE @B3
XOR AH, AH
;Tut my znaem indek pervogo elementa
PUSH AX
@B4:
LEA SI, TEXT6
CALL PRINTS
LEA DX, BUF
CALL GETS
PUTLN
LEA SI, BUF
CALL VALUE
CMP AL, 3FH
JE @B4
CMP AL, BL
JGE @B4
XOR AH, AH
;V steke nakhodyatsya indeksy elementov

;Poluchaem elementy
LEA SI, MAS
MOV BX, TYPE FIX
MUL BX
ADD SI, AX

MOV CX, WORD PTR [SI].H ;Vtoraya kharkteristika

POP AX ;Izvlekaem 2 indeks
PUSH SI ;zanosim element
LEA SI, MAS
MUL BX
ADD SI, AX

MOV DX, WORD PTR [SI].H ;pervaya kharakteristika

CMP DX, CX
JG @B6
JL @B7

MOV AX, WORD PTR [SI].M
POP SI
MOV BX, WORD PTR [SI].M
ADD AX, BX
;Na etot moment kharakteristiki ravny
PUSH DX
PUSH AX
JMP @B8
@B6:
SUB CX, DX
NEG CX
;V DX nakhoditsya raznost' kharakteristik
MOV AX, WORD PTR [SI].M
POP SI
MOV BX, WORD PTR [SI].M
SHR BX, CL
ADD AX, BX
;V AX nakhoditsya summa mantis
PUSH DX
PUSH AX
JMP @B8
@B7:
SUB CX, DX
MOV AX, WORD PTR [SI].M
SHR AX, CL
POP SI
MOV BX, WORD PTR [SI].M
ADD AX, BX
;V AX nakhoditsya summa mantis
ADD DX, CX
PUSH DX
PUSH AX
@B8:
;Tut vyvod znacheniy
LEA SI, TEXT7
CALL PRINTS
POP AX
CALL PRINTD
MOV AL, 65H
CALL PUTC
POP AX
CALL PRINTD
PUTLN

@END:
MOV AH, 4CH ;vykhod iz programmy
MOV AL, 0
INT 21H
END BEGIN


КОд произведения чисел в двоичной системе и вывод в десятичной.

Последний раз редактировалось Влад_+_; 23.01.2017 в 22:23.
Влад_+_ вне форума Ответить с цитированием
Старый 24.01.2017, 19:35   #2
MansMI
Пользователь
 
Регистрация: 04.07.2012
Сообщений: 32
По умолчанию

и что с этим делать?
MansMI вне форума Ответить с цитированием
Старый 25.01.2017, 00:17   #3
Влад_+_
Пользователь
 
Регистрация: 22.12.2015
Сообщений: 10
По умолчанию

Цитата:
Сообщение от MansMI Посмотреть сообщение
и что с этим делать?
это код суммы двоичных чисел, мне надо произведение
Влад_+_ вне форума Ответить с цитированием
Старый 25.01.2017, 01:09   #4
MansMI
Пользователь
 
Регистрация: 04.07.2012
Сообщений: 32
По умолчанию

mansmi@rambler.ru пишите
MansMI вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Произведение двоичных чисел в ассемблере Влад_+_ Помощь студентам 4 24.01.2017 09:55
Сложение двоичных чисел в Ассемблере Дмитрий142 Помощь студентам 0 26.04.2011 18:26
Вывод значения числа в десятичной системе счисления Kaizzer Помощь студентам 0 23.04.2011 14:44
Скан-код нажатой клавиши в dec(десятичной системе) Alex1991 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 11.11.2010 16:33