|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
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 |
Пользователь
Регистрация: 04.07.2012
Сообщений: 32
|
и что с этим делать?
|
25.01.2017, 00:17 | #3 |
Пользователь
Регистрация: 22.12.2015
Сообщений: 10
|
|
25.01.2017, 01:09 | #4 |
Пользователь
Регистрация: 04.07.2012
Сообщений: 32
|
mansmi@rambler.ru пишите
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Произведение двоичных чисел в ассемблере | Влад_+_ | Помощь студентам | 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 |