Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как добавить переменную, assembler 
:(
    Опции темы
fuckingniger
Дата 14.3.2011, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 1.10.2010

Репутация: нет
Всего: 1



Код

TITLE   XCOM1  COM-программа для пересылки и сложения
CODESG  SEGMENT PARA 'Code'
        ASSUME  CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
        ORG     100H            ;Начало в конце PSP
BEGIN:  JMP     MAIN            ;Обход через данные
; ---------------------------------------------------
FLDA    DW      250             ;Определение данных
FLDB    DW      125
FLDC    DW      ?
mssgA    DB    'Enter A: $'
mssgB    DB    'Enter B: $'
mssgD    DB    'Enter D: $'
mssgQ    DB    'quotient: $'
mssgR    DB    'residue: $'
mssgE    DB    'Overflow error $'
mssgE1    DB    'Input string has another symbols $'
mssgE2    DB    'Divide by null $'

input    DB    10 dup(0)
output    DB    10 dup(0)
RESULT    DW        0
MUL_RESULT    DD    0
; ---------------------------------------------------
MAIN    PROC    NEAR
        MOV     AX,FLDA         ;Переслать 0250 в AX
        ADD     AX,FLDB         ;Прибавить 0125 к AX
        MOV     FLDC,AX         ;Записать сумму в FLDC

    
    
    LEA    DX,mssgD
    CALL    WRITE
    
    MOV    input[0],6    ;Максимальный размер для ввода
    LEA    DX,input    ;Загрузка адреса входной строки в регистр
    
    CALL READ            ;Ввод числа D
    LEA    SI,RESULT
    CALL STR_TO_INT
    MOV BX,DX
    
    
    LEA    DX,mssgB
    CALL    WRITE
    LEA    DX,input        ;Ввод числа B
    CALL READ
    CALL STR_TO_INT
    MOV    CX,DX
    
    
    LEA    DX,mssgA
    CALL    WRITE
    LEA    DX,input        ;Ввод Числа А
    CALL READ
    CALL STR_TO_INT
    
    
    CALL CALCULATE
    LEA    SI,output
    PUSH    DX
    MOV        DX,AX
    CALL INT_TO_STR
    
    LEA    DX,mssgQ
    CALL    WRITE
    
    LEA        DX,output
    CALL    WRITE
    
    LEA    SI,output
    POP        DX
    CALL INT_TO_STR
    LEA    DX,mssgQ
    CALL    WRITE
    
    LEA        DX,output
    CALL    WRITE
    
    MOV    AH, 01        ;Лишний ввод для контроля
    INT    21h
    
    
        RET                     ;Вернуться в DOS
MAIN    ENDP

WRITE    PROC
    PUSH    AX
    MOV    AH, 09h
    INT    21h
    POP    AX
    RET
WRITE    ENDp

READ    PROC
    PUSH    AX
    MOV        AH,0Ah
    INT        21h
    CALL    clear_scr
    POP        AX
    RET
READ    ENDP

STR_TO_INT    PROC    NEAR
    PUSH    AX        ;Сохранение значения регистров
    PUSH    CX
    PUSH    BX
    PUSH    SI
    XOR        AX,AX    ;Обнуление регистров
    XOR        CX,CX
    XOR        BX,BX
    XOR        SI,SI
    MOV        SI,DX    ;Перенос адреса строки в регистр BP
    INC        SI        ;Переход к реальному количеству символов
    ADD        CL,[SI]    ;Установка счетчика цикла
    MOV        BL,10    ;Помещение второго сомножителя в регистр
L:
    INC        SI        ;Переход к следующему символу строки
    MUL        BX        ;Умножение содержимого регистра АХ на 10
    JO        ERROR    ;Подозрение на переполнение, хотя возможно переполнился только 1 регистр
TRANSLATE:
    MOV        DX,AX    ;Перемещение произведения
    MOV        AL,[SI]    ;Добавление в регистр код текущего символа строки
    cmp        AL,30h    ;Проверка на нижнюю границу допустимых кодов ASCII
    jl        SYMB_ERROR
    cmp        AL, 39h    ;Проверка на верхнюю границу доустимых кодов
    jg        SYMB_ERROR
    SUB        AL,30h    ;Вычитание кода символа "0"
    CBW
    ADD        DX,AX    ;Добавление цифры к произведениюмы в АХ для умножения
    MOV        AX,DX    ;Перекидывание получившейся су
LOOP    L            ;организация цикла
    MOV        DX,AX    ;Возврат числа из функции
    POP        SI
    POP        BX
    POP        CX
    POP        AX
    RET
ERROR:
    LEA        DX,mssgE
    CALL    WRITE
    CALL    DOS_EXIT
SYMB_ERROR:
    LEA        DX,mssgE1
    CALL    WRITE
    CALL    DOS_EXIT    

STR_TO_INT ENDP
    
INT_TO_STR  PROC    NEAR
    PUSH    AX        ;Сохранение значения регистров
    PUSH    CX
    PUSH    BX
    XOR        AX,AX    ;Обнуление регистров
    XOR        CX,CX
    XOR        BX,BX
    ;OV        CX,DX    ;Сохранение регистра DХ

    MOV        AX,DX    ;Перемещение делимого
    MOV        BL,10    ;Перемещение делителя
    XOR        DX,DX    ;Обнуление
    
PUSHSTACK:
    DIV        BX        ;Деление на 10
    ADD        DL,30h    ;Получение Аски кода
    ;MOV        DX,CX    ;Возврат значения DX
    ;MOV        DL,AH    ;Копирование символа из регистра 
    PUSH    dx
    XOR        DX,DX
    INC        CL        ;Увеличиваем счетчик
    CMP        AX,0    ;Сравниваем частное с нулем
    JNZ    PUSHSTACK
POPSTACK:
    POP        DX;
    MOV        [SI],DL    ;Занесение символа в строку
    INC        SI        ;Переход к следующему символу
    LOOP    POPSTACK

    MOV [SI],24h
    POP        BX
    POP        CX
    POP        AX
    RET
    
INT_TO_STR  ENDP

CALCULATE PROC
    XOR        AX,AX
    MOV        AX,BX    ;Загрузка множимого D в регистр
    PUSH    DX        ;Сохранение множителя A в стеке
    MUL        DX
    POP        BX            ;Вытаскивание сохраненного слагаемого
    ADD        BX,CX        ;Получение делителя
    JO        OVERFLOW_EXIT
    CMP        BX,0        ;проверка на деление на ноль
    JE        NULL_ERROR
    DIV        BX
    RET
NULL_ERROR:
    LEA        DX,mssgE2
    CALL    WRITE
    CALL    DOS_EXIT
OVERFLOW_EXIT:
    LEA        DX, mssgE
    CALL    WRITE
    CALL    DOS_EXIT
CALCULATE    ENDP

DOS_EXIT    PROC
    MOV        AH,07h
    INT        21h;
    INT        20h;
DOS_EXIT    ENDP

clear_scr proc 
   push ax
   push bx
   push cx
   push dx
   xor al,al        ; al:=0 Очистить окно
   xor cx,cx        ; cx:=0 Верхний левый угол (0,0)
   mov dh,24        ; Нижняя строка экрана  24
   mov dl,79        ; Правый столбец экрана 79
   mov bh,7         ; Нормальные атрибуты очистки
   mov ah,6         ; вызов функции scroll_up 
   int 10h
   pop dx
   pop cx
   pop bx
   pop ax
   ret
clear_scr endp  
    
CODESG  ENDS
        END     BEGIN

        21cd 5a21


вот это работающая программа

мне надо добавить переменную C
для этого я произвожу такие изменения:
Код

mssgB    DB    'Enter B: $'
mssgB    DB    'Enter C: $'
mssgD    DB    'Enter D: $'


и тут

Код

CALL READ            ;Ввод числа D
    LEA    SI,RESULT
    CALL STR_TO_INT
    MOV BX,DX
    
    
    LEA    DX,mssgB
    CALL    WRITE
    LEA    DX,input        ;Ввод числа B
    CALL READ
    CALL STR_TO_INT
    MOV    CX,DX

              LEA    DX,mssgС
    CALL    WRITE
    LEA    DX,input        ;Ввод числа С
    CALL READ
    CALL STR_TO_INT
    MOV    DI,DX
    
    
    LEA    DX,mssgA
    CALL    WRITE
    LEA    DX,input        ;Ввод Числа А
    CALL READ
    CALL STR_TO_INT
    


и после этого не понимаю, что происходит, но переменная A считывается неправильно.
что скажете ?

PM MAIL   Вверх
500mhz
Дата 16.3.2011, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



Код

mssgB    DB    'Enter B: $'
mssgB    DB    'Enter C: $'


а как оно вообще компилится при двух одинаковых именах переменных? mssgB 


--------------------

PM MAIL ICQ   Вверх
fuckingniger
Дата 16.3.2011, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 1.10.2010

Репутация: нет
Всего: 1



Цитата(500mhz @ 16.3.2011,  18:51)
Код

mssgB    DB    'Enter B: $'
mssgB    DB    'Enter C: $'


а как оно вообще компилится при двух одинаковых именах переменных? mssgB

это уже ошибка того, что я неправильно тут написал - исправлял на ходу.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0425 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.