Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Решить задачу


Автор: flow11 9.5.2010, 20:13
Ребят, помогите пожалуйста.
user posted image 
 Написать модуль на языке Ассемблера для обработки строк (в виде процедуры или макроса).
 Написать на языке Ассемблера программу корректного ввода исходных данных.

Автор: iff 9.5.2010, 21:39
Цитата

для обработки строк 

но функция, предложенная вами работает с числами... (Y, a и b). По какому алгоритму обрабатывать строки?

Цитата

ввода исходных данных

Для ввода a и b?
числа a и b имеют какой тип?

Автор: flow11 9.5.2010, 21:51
Это весь текст задания, наверное числа a и b - действительные

Автор: Mikl_ 11.5.2010, 12:37
Цитата(flow11)
наверное числа a и b - действительные

 smile ошибаетесь! были бы они действительными, было бы написано 2.0*a/b+1.0 и (b+5.0)/a исходить нужно от того объясняли ли вам как программировать FPU или нет, а судя по заданию "Написать модуль на языке Ассемблера для обработки строк (в виде процедуры или макроса).
 Написать на языке Ассемблера программу корректного ввода исходных данных." smile  это целочисленное программирование

Автор: iff 11.5.2010, 18:03
Для TASM. Пограмма типа COM. Системные требования: процессор не ниже 286, ОС семейства ДОС.
Работает с целыми знаковыми числами размерностью слово
Код

        .MODEL  TINY
        .CODE
        .286
        ORG     100H
MAIN    PROC    NEAR

;********************************* Ввод данных ********************************

        LEA     DX, A_PRMPT             ;Приглашение для ввода
        CALL    INPUT                   ;Ввод
        MOV     A, AX                   ;Результат ввода в a

        LEA     DX, B_PRMPT             ;Приглашение для ввода
        CALL    INPUT                   ;Ввод
        MOV     B, AX                   ;Результат ввода в b

;************************************ Ядро ************************************

        ;AX содержит b
        CMP     AX, A                   ;Сравнить b и a
        JG      MENSHE                  ;Перейти если a<b
        JL      BOLSHE                  ;Перейти если a>b

ROVNO:  MOV     AX, -445                ;Выполняется если a=b, Y в AX
        JMP     EXIT

MENSHE: ADD     AX, 5                   ;Выполняется если a<b, Y в AX
        IDIV    A
        JMP     EXIT

BOLSHE: MOV     AX, A                   ;Выполняется если a>b, Y в AX
        IMUL    AX, 2
        IDIV    B
        INC     AX

;******************************* Вывод результата *****************************

EXIT:   MOV     WORD PTR Y_STR+6, 0A0DH ;Добавить в строку для вывода символы
        MOV     Y_STR+8, '$'            ;   перевода каретки и конца вывода

        LEA     DI, Y_STR+5             ;Адрес строки для вывода
        PUSH    AX
        CMP     AX, 0                   ;Число меньше 0?
        JNL     OUT0
        NEG     AX                      ;   если да, то поменять знак
OUT0:   MOV     BX, 10
OUT1:   XOR     DX, DX
        DIV     BX                      ;Разделить на 10
        OR      DL, 00110000B           ;Преобразовать двоичный остаток в цифру
        MOV     [DI], DL                ;Добавить в строку для вывода 
        CMP     AX, 0                   ;Частное отделения равно 0?
        JE      OUT2                    ;   если да, то выход
        DEC     DI                      ;Следующий символ
        JMP     OUT1                    ;Повторить

OUT2:   POP     AX
        CMP     AX, 0                   ;Число было меньше 0?
        JNL     OUT3                    ;   если да, то поставить знак минус
        DEC     DI
        MOV     BYTE PTR [DI], '-'

OUT3:   MOV     AH, 9                   ;Приглашение для вывода Y
        LEA     DX, Y_PRMPT
        INT     21H
        MOV     DX, DI                  ;Вывод Y
        INT     21H
        MOV     AH, 7                   ;Пауза
        INT     21H
        RET                             ;Возвратить управление ДОС

MAIN    ENDP

;*********************** Подпрограмма ввода ASCII-чисел ***********************

INPUT   PROC    NEAR
        MOV     AH, 9                   ;Приглашение для ввода
        INT     21H
        MOV     AH, 0AH                 ;Ввод строки
        LEA     DX, P_LIST
        INT     21H
        MOV     MFACT, 1                ;Элемент данных, хранит степень 10
        MOV     MVALUE, 0               ;Элемент данных, хранит результат
        LEA     DI, KB_DATA             ;Адрес строки для чтения
        MOV     CL, ACT_LEN             ;Длина строки
        ADD     DI, CX
INP1:   DEC     DI                      ;Следующая цифра
        XOR     AX, AX
        MOV     AL, [DI]                ;Загрузить цифру в аккумулятор
        CMP     AL, '-'                 ;Это минус?
        JNE     INP2
        NEG     MVALUE                  ;   если да, то поменять знак
        JMP     INP3                    ;   результата и выйти
INP2:   AND     AL, 00001111B           ;Преобразовать цифру в двоичное число
        MUL     MFACT                   ;Умножить на 10 в степени n
        ADD     MVALUE, AX              ;Добавить к результату
        MOV     AX, 10                  ;Следующая степень 10
        MUL     MFACT
        MOV     MFACT, AX
        LOOP    INP1                    ;Повторить
INP3:   MOV     AX, MVALUE              ;В AX результат
        RET                             ;Возвратить управление программе
INPUT   ENDP

;*********************************** Данные ***********************************

A_PRMPT DB      'a = $'                 ;Приглашения для ввода и вывода
B_PRMPT DB      0DH, 0AH, 'b = $'
Y_PRMPT DB      0DH, 0AH, 'Y = $'

P_LIST  LABEL   BYTE                    ;Область данных для ввода с клавиатуры
MAX_LEN DB      7
ACT_LEN DB      ?
KB_DATA DB      7 DUP (?)

MFACT   DW      ?                       ;Необходима подпрограмме преобр. чисел
MVALUE  DW      ?                       ;Необходима подпрограмме преобр. чисел

A       DW      ?                       ;Значение a
B       DW      ?                       ;Значение b
Y_STR   DB      9 DUP (?)               ;Значение Y в формате ASCII-числа

        END     MAIN

Автор: flow11 11.5.2010, 19:20
iff, спасибо Вам огромное!

Автор: iff 11.5.2010, 21:32
ВНИМАНИЕ!!!
Я решил немного отредактировать прошлый вариант. а именно, те 2 части кода, которые выводят приглашение перед вводом переменных a и b, и те части которые осуществляют ввод строк с клавиатуры, добвены в подпрограмму, т.к. они повторяется.
Поэтому исполняемый файл стал меньше весить, а код выглядит более понятно.

Получившийся новый вариант скачайте из аттача выше и просмотрите его код тамже, в моём прошлом сообщении.

Автор: flow11 11.5.2010, 22:18
iff, спасибо! скачал обновленный вариант, в коде в принципе разобралсяsmile

Автор: Ruso 12.5.2010, 11:13
Помогите пожалуйста сделать это задание
первый вариант решить все 5 задач !!! Зарание Спосибо

Автор: Mikl_ 12.5.2010, 12:42
Ruso, 
тебе даже лень задание набирать, а почему кто-то его должен для тебя бесплатно решать? Тем более что, задания простейшие, ничего интересного

Автор: iff 12.5.2010, 16:33
flow11, Ой, я тут ошибку нашел в 111 и 113 строках. в 111 строке переменная MAX_LEN содержит значение, равное максимальному количеству введенных символов. я забыл что оно должно быть на 1 больше реального количества (из-за добавляемого символа 0DH) т.е. не 6, а 7. В строке 113 соответственно нужно области KB_DATA отвести ещё один байт для этого символа 0DH.
Ну и ещё 2 маленькие недочета, которые устранены: в строке 27 я убрал инструкцию mov ax, b, т.к. ax уже содержит b. И в строке 38 исправил: там нужно помещать не 0D0AhH, а 0A0DH, т.к. байты меняються местами, когда храняться в оперативной памяти. короче ещё раз скачивай smile


Ruso, что представляет собой само задание? нужно посчитать при помощи математического сопроцессора? Программа должно запрашивать данные с клавиатуры и выводить результат на экран или же только просто посчитать и всё?

Автор: iff 12.5.2010, 21:18
там на картинке внизу справа задание написано, я не прочитал. судя по всему это целые числа (со знаком наверно).
Вот для первого:
Код

.data
a dw -5
b dw 500
c dw 8
d dw 2
result dw ?

.code
mov ax, a
add ax, b
sub ax, c
idiv d
mov result, ax


Для второго:
Код

.data
a dw 300
b dw -7
c dw 1000
result dw ?

.code
mov ax, a
imul b
imul c
imul c
mov result, ax


3)
Код

.data
a dw 100
b dw -100
c dw 70
result dw ?

.code
mov ax, b
imul c
mov dx, a
sub dx, ax
mov result, dx


4)
Код

.data
b dw -70
c dw 3
result dw ?

.code
mov ax, 5
imul b
push ax
mov ax, c
mov cx, 4
m: imul c
loop m
pop dx
sub dx, ax
mov result, dx


5)
Код

.data
a dw 30
b dw 10
c dw -600
result dw ?

.code
muv ax, a
idiv b
sub ax, c
mov result, ax

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)