Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Asembler - CO zrobiłem źle

pitereko123 19 Lis 2012 09:33 2346 6
  • #1 19 Lis 2012 09:33
    pitereko123
    Poziom 6  

    Mam pewien problem otóż program dodaje 2 liczby wprowadzane z klawiatury ale tylko suma do 10 co zrobiłem źle i jak mam przekształcić program żeby zapisywał do pliku wynik?

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    0 6
  • #2 19 Lis 2012 17:28
    Dżyszla
    Poziom 42  

    Ależ sumuje dobrze, tylko żeby wyświetlić, musisz dokonać odpowiednich konwersji. Pamietaj, że wyswietlasz tylko znak o wskazanym kodzie ASCII. Dodawanie i odejmowanie od tego kodu 30h powoduje "konwersję" cyfry na kod ASCII tejże cyfry lub odwrotnie.

    Zatem wyswietlanie wyników >= 10 wymusza potrzebę wyświetlenia dwóch znaków:
    1. O wartości ASCII (wynik MOD 10) + 30h
    2. O wartości ASCII (wynik DIV 10) + 30h
    gdzie MOD to reszta z dzielenia, a DIV to część całkowita z dzielenia (zapoznaj się z instrukcją DIV/IDIV)

    0
  • #3 26 Lis 2012 09:53
    pitereko123
    Poziom 6  

    OK, dzięki. Ale jak go przekształcić żeby zapisywało do pliku?

    0
  • #5 30 Lis 2012 21:14
    pitereko123
    Poziom 6  

    mam już zapis do pliku ale nie umiem przekształcic na liczby dziesiętne pomoże ktoś z tym kodem??

    .MODEL SMALL
    .STACK 100H

    .DATA
    PROMPT_1 DB 'Podaj pierwsza liczbe: $'
    PROMPT_2 DB 'Podaj druga liczbe: $'
    PROMPT_3 DB 'Suma liczb to: $'

    VALUE_1 DB ?
    VALUE_2 DB ?

    Bufor DB 'Hello world'

    wynik DB ?

    Plik DB 'WYNIK2.txt',0
    .CODE
    MAIN PROC
    MOV AX, @DATA
    MOV DS, AX

    LEA DX, PROMPT_1 ;wczytuje rejestr 1
    MOV AH, 9
    INT 21H

    MOV AH, 01h ;wczytuje wprowadzony znak
    INT 21H

    SUB AL, 30H ;zapisuje pierwsza liczbe w ASCII
    MOV VALUE_1,AL

    MOV AH, 2
    MOV DL, 0DH
    INT 21H

    MOV DL, 0AH
    INT 21H

    LEA DX, PROMPT_2 ;wczytuje rejestr 2
    MOV AH, 9
    INT 21H

    MOV AH, 01h ;wczytuje wprowadzony znak
    INT 21H

    SUB AL, 30H ;zapisuje druga liczbe w ASCII
    MOV VALUE_2,AL

    MOV AH, 2
    MOV DL, 0DH
    INT 21H

    MOV DL, 0AH
    INT 21H

    LEA DX, PROMPT_3 ;wczytuje rejestr 3
    MOV AH, 9
    INT 21H



    xor ax,ax
    xor bx,bx

    MOV AL, VALUE_1 ;dodawanie wprowadzonych liczb
    add AL, VALUE_2



    ADD AL, 30H ;zamiana ASCII do dziesitnej

    MOV AH, 2 ;wyswietlanie
    MOV DL,AL
    INT 21H

    mov wynik,DL

    ; Otworzenie istniejącego pliku
    MOV AH, 3Dh
    MOV AL, 1
    MOV DX, SEG Plik
    MOV DS, DX
    MOV DX, OFFSET Plik
    INT 21h
    JC Koniec



    ; Zapisanie danych z bufora
    MOV BX, AX
    MOV AH, 40h
    MOV DX, SEG wynik
    MOV DS, DX
    MOV DX, OFFSET wynik
    MOV CX, 11
    INT 21h
    JC Koniec

    ; Zamknięcie pliku
    MOV AH, 3Eh
    INT 21h
    JC Koniec

    Koniec:

    ; Koniec programu
    MOV AH, 04Ch
    INT 21h

    MAIN ENDP
    END MAIN

    Proszę umieszczać kod w znacznikach syntax. Opcja Listing kodu. Zdanie rozpoczynamy z wielkiej litery. Proszę to poprawić. [adamas_nt]

    0
  • #7 15 Sty 2013 15:22
    Remeknapr
    Poziom 33  

    pitereko123 napisał:
    mam już zapis do pliku ale nie umiem przekształcic na liczby dziesiętne ,,,

    Są gotowe procedury służące do tego celu. Spróbuj znaleźć w sieci. Jeśli Ci się to nie uda podam link.

    0