Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите, пожалуйста, с написанием программы...

26K
24 января 2012 года
Darknessa
2 / / 19.04.2007
Необходимо написать программу, я абсолютно никогда раньше не встречалась с ассемблером, но возникла такая необходимость. Задание и мною написанный код приведены ниже. Вылетает ошибка "Процессор обнаружил недопустимую инструкцию". Подскажите в каком направлении двигаться, что не так (очень может быть что многое не так). Не оставьте без внимания, пожалуйста.

Код:
;+Пользователь вводит два числа А и В в десятичном виде. Программа должна:
;+1. Посчитать С=А+В*2.
;2. Если третий бит числа С установлен, то вывести на экран С в двоичном виде, в противном случае, вывести на экран С/2 в двоичном виде.
;+3. Написать макрос для вывода результата
;+4. Написать процедуру для ввода чисел
;+5. Написать макрос для расчета
;+6. Передача параметров через стек
;+7. Используйте стандартные директивы сегментации и формат сом-программы.
 
cseg segment                                    
org 100h                                                
 
coutStr macro a                 ;вывод строки
        push ax                        
        push dx                        
        mov ah, 9                      
        mov dx, offset a        
        int 21h
        pop dx
        pop ax
endm
 
calc macro
        local m1, m2
        shl dx, 1
        coutStr endl
        coutStr mes3
        print dx
        coutStr endl
        add ax, dx
        coutStr mes4
        print ax
        coutStr endl
        mov dx, ax
        and dx, 1000b
        cmp dx, 1000b
        je m1
        coutStr mes6
        shr ax, 1
        print ax
        jmp m2
m1:
        coutStr mes5
        print ax
m2:
endm
 
print macro     a                       ;выводит ax в двоичном
        local cicl
        push dx
        push ax
        mov bx, a
        mov cx, 16                      
cicl:
        xor dx, dx                      
        sal bx, 1                      
        adc dl, 30h                    
        mov ah, 2                      
        int 21h                        
        loop cicl
       
        pop ax
        pop dx
endm
 
main:
        coutStr mes1
        call input      
        push dx
        coutStr endl    
        coutStr mes2
        call input
        pop ax                  
        calc                    ;a-ax,b-dx
               
        int 20h
;main endp
 
input proc                              ;ввод  числа
        jmp     start
startErr:
        coutStr endl
        coutStr inErr
start:
        mov cx, 3
        xor dx, dx
m1:                                            
        xor ax, ax                      
        mov ah, 1h
        int 21h
        sub al, 30h                    
        cmp al, 9                      
        ja m2                          
        xor bx, bx                      
        mov bl, al                      
        xor ax, ax                      
        mov al, dl                      
        xor dx, dx                      
        mov dl, 10
        mul dl                          
        cmp ah,0                
        ja  startErr    
        xor dx, dx
        mov dl, al              
        add dx, bx              
        cmp dh, 0      
        ja startErr    
        loop m1
m2:
        ret 0
input endp
 
        mes1 db "vvedite A(00 < A < 255): $"
        mes2 db "vvedite B(00 < B < 255): $"
        mes3 db "B*2 = $"
        mes4 db "C = A+B*2 = $"
        mes5 db "C = $"
        mes6 db "C/2 = $"
        inErr db "Owibka vvoda!! Vvedite zanovo: $"
        endl db " ", 10, '$'
       
cseg ends
 
end main
277
24 января 2012 года
arrjj
1.7K / / 26.01.2011
В тексте ошибки должен был быть номер строки.
7
27 января 2012 года
@pixo $oft
3.4K / / 20.09.2006
Неа,не должен,если это вдруг NTVDM выдал.Максимум смещение,которое малоинформативно
Надо попробовать погонять программу под отладчиком

На первый взгляд страшных инструкций обнаружено не было
43K
23 февраля 2012 года
Павел_AF
6 / / 19.10.2008
Добавь ASSUME
 
Код:
cseg segment
    ASSUME cs:cseg, ds:cseg, ss:cseg, es:cseg
 org 100h

Если не пользуешься упрощённым описанием сегментов - не забывай про ASSUME.
У меня TASM отказывался даже компилировать без неё.
И ещё - перевод строки это не только 10 - это
 
Код:
endl db 13, 10, '$'

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог