Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заменить команды на альтернативы (без использовани 
:(
    Опции темы
Oxidous
Дата 23.12.2015, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем доброго времени суток,

Задание такое (делается в emu8086): Пользователь вводит координаты левого верхнего (x1, y1) и правого нижнего (x2, y2) углов прямоугольника. Программа должна нарисовать прямоугольник на экране и вывести его периметр (P) и площадь (S).
Примечание: Для ввода/вывода использовать прерывания (INT). Не использовать никакие команды "emu, macro" и т.п.

Вот код:

Код

include 'emu8086.inc' ; подключение директивы
org 100h 
; приветствие
mov dx, offset msg1
mov ah, 9
int 21h   
call scan_num           
; очистка экрана
call CLEAR_SCREEN
 
; вывод значений
mov dx, offset msg2
mov ah, 9
int 21h
call scan_num
 
mov xkord, cx
 
call CLEAR_SCREEN
 
mov dx, offset msg3
mov ah, 9
int 21h
call scan_num
 
mov ykord, cx
 
call CLEAR_SCREEN
 
mov dx, offset msg4
mov ah, 9
int 21h
call scan_num
 
mov shirina, cx
 
 
call CLEAR_SCREEN
 
mov dx, offset msg5
mov ah, 9
int 21h
call scan_num
 
mov dlina, cx
 
; вычисляем площадь и периметр прямоугольника          
; площадь прямоугольника
mov ax, dlina
mul shirina
mov plosiad, ax
 
; периметр прямоугольника
mov bx, shirina
add bx, dlina
add bx, bx
mov perimetr, bx
 
call CLEAR_SCREEN
 
mov dx, offset msg6
mov ah, 9
int 21h
 
mov dx, offset msg7
mov ah, 9
int 21h
 
mov dx, offset msg8
mov ah, 9
int 21h
 
mov ah, 0
int 16h
 
; находим правый верхний угол прямоугольника 
mov ax, xkord
mov bl, 2
div bl
mov b.[xkord], al
 
mov ax, ykord
mov bl, 2
div bl
mov b.[ykord], al
 
; выставляем видео режим 640x480, 16 цветов
mov al, 12h    
mov ah, 0
int 10h
 
mov cx, xkord
mov dx, ykord
 
mov bx,dlina
add bx,xkord
mov p1, bx
 
; чертим верхнюю линию
mov al, 50  
 
VerhLinia:
 
mov ah, 0ch
int 10h
 
inc cx
 
cmp cx,p1
 
JNAE VerhLiniia
 
mov cx, xkord
mov dx, ykord
 
mov bx, ykord
add bx, shirina
mov p2, bx
 
; чертим левую линию
 
LevLinia:
 
 
mov ah,0ch 
; левая линия фиолетового цвета
mov al, 5
int 10h
 
inc dx
 
cmp dx,p2
 
JNAE LevLinia
 
mov bx, cx
add bx, dlina
mov p3, bx
 
; чертим нижнюю линию
 
NiznLinija:
 
 
mov ah,0ch  
; нижняя линия красного цвета
mov al, 4
int 10h
 
inc cx
 
cmp cx,p3
 
JNAE NiznLinia 
 
mov bx,ykord
mov p4, bx       
 
; чертим правую линию
 
PravLinija:
 
 
mov ah,0ch  
; правая линия голубого цвета
mov al, 3
int 10h
 
dec dx
 
cmp dx,p4
 
JNB PravLinia 
 
ret    
 
dlina dw 0
shirina dw 0
xkord dw 0
ykord dw 0
plosiad dw 0
perimetr dw 0  
msg1 db 'Pogrammu napisal: Imia Familija. Nazmite <Enter> ', '$'
msg2 db 'Vvedite X koordinatu centra priamougolnika: ', '$'
msg3 db 'Vvedite Y koordinatu centra priamougolnika: ', '$'
msg4 db 'Vvedite shirinu priamougolnika (max 480): ', '$'
msg5 db 'Vvedite dlinu priamougolnika (max 640): ', '$'
msg6 db 'Plosiad Vashego priamougolnika: ', '$'
msg7 db 'Perimetr vashego priamougolnika: ', '$'
msg8 db 'Dlia sozdanija priamougolnika nazmite <ENTER>', '$'
 
 
p1 dw 0 ;конец верхней линии x
p2 dw 0 ;конец левой линии y
p3 dw 0 ;конец нижней линии x
p4 dw 0 ;конец правой линии y
 
DEFINE_SCAN_NUM
DEFINE_CLEAR_SCREEN
end


А можно ли чем то заменить директиву "include emu8086.inc"? Просто препод хочет,чтоб не использовались директивы и всякие команды macro.
Чем тогда можно заменить "call scan_num" и "call CLEAR_SCREEN"? Чтоб убрать из программы emu8086.inc?

Заранее благодарю за ответ.
PM MAIL   Вверх
leniviy
Дата 24.12.2015, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



> можно ли чем то заменить директиву "include emu8086.inc"?
находишь файл emu8086.inc и добавляешь его содержимое вместо директивы include.


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
ФедосеевПавел
Дата 24.12.2015, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 10



Если вы умеете читать, то
1. CLEAR_SCREEN - очистку экрана можно реализовать через int 10h AH=06h.
2. scan_num - обычный ввод числа - через int16h и умножение-сложение. пример из FAQвариации на FAQ.

Назначение остального (DEFINE_SCAN_NUM, DEFINE_CLEAR_SCREEN) я не понимаю.
PM   Вверх
Oxidous
Дата 28.12.2015, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток,

Выкладываю код программы, быть может кому-то пригодится:

Код

org 100h
    ; приветствие
    mov dx, offset msg1
    mov ah, 9
    int 21h  
    call MY_SCAN_NUM        
    ; очистка экрана
    call CLEAR_SCREEN
    
    ; вывод значений
    mov dx, offset msg2
    mov ah, 9
    int 21h
    call MY_SCAN_NUM
    
    mov xkord, cx
    
    call CLEAR_SCREEN
    
    mov dx, offset msg3
    mov ah, 9
    int 21h
    call MY_SCAN_NUM
    
    mov ykord, cx
    
    call CLEAR_SCREEN
    
    mov dx, offset msg4
    mov ah, 9
    int 21h
    call MY_SCAN_NUM
    
    mov shirina, cx
    
    
    call CLEAR_SCREEN
    
    mov dx, offset msg5
    mov ah, 9
    int 21h
    call MY_SCAN_NUM
    
    mov dlina, cx
    
    ; вычисляем площадь и периметр прямоугольника          
    ; площадь прямоугольника
    mov ax, dlina
    mul shirina
    mov plosiad, ax
    
    ; периметр прямоугольника
    mov bx, shirina
    add bx, dlina
    add bx, bx
    mov perimetr, bx
    
    call CLEAR_SCREEN
    
    mov dx, offset msg6
    mov ah, 9
    int 21h
    mov AX, plosiad  
    call vivod_cisla
    
    mov dx, offset msg7
    mov ah, 9
    int 21h
    mov AX, perimetr
    call vivod_cisla
    
    mov dx, offset msg8
    mov ah, 9
    int 21h
    
    mov ah, 0
    int 16h
    
    ; находим правый верхний угол прямоугольника
    mov ax, xkord
    mov bl, 2
    div bl
    mov b.[xkord], al
    
    mov ax, ykord
    mov bl, 2
    div bl
    mov b.[ykord], al
    
    ; выставляем видео режим 640x480, 16 цветов
    mov al, 12h    
    mov ah, 0
    int 10h
    
    mov cx, xkord
    mov dx, ykord
    
    mov bx,dlina
    add bx,xkord
    mov p1, bx
    
    ; чертим верхнюю линию
    mov al, 50  
    
    VerhLinia:
    
    mov ah, 0ch
    int 10h
    
    inc cx
    
    cmp cx,p1
    
    JNAE VerhLinia
    
    mov cx, xkord
    mov dx, ykord
    
    mov bx, ykord
    add bx, shirina
    mov p2, bx
    
    ; чертим левую линию
    
    LevLinia:
    
    
    mov ah,0ch
    ; левая линия фиолетового цвета
    mov al, 5
    int 10h
    
    inc dx
    
    cmp dx,p2
    
    JNAE LevLinia
    
    mov bx, cx
    add bx, dlina
    mov p3, bx
    
    ; чертим нижнюю линию
    
    NiznLinia:
    
    
    mov ah,0ch  
    ; нижняя линия красного цвета
    mov al, 4
    int 10h
    
    inc cx
    
    cmp cx,p3
    
    JNAE NiznLinia
    
    mov bx,ykord
    mov p4, bx      
    
    ; чертим правую линию
    
    PravLinia:
    
    
    mov ah,0ch  
    ; правая линия голубого цвета
    mov al, 3
    int 10h
    
    dec dx
    
    cmp dx,p4
    
    JNB PravLinia
    
    ret    
    MY_SCAN_NUM PROC NEAR
     mov AH, 2
     mov DL, '>'    ; приглашение
     int 21h ; выводим приглашение
     xor DI, DI     ; итоговое число, - пока ноль
    my_input:
     mov AH, 8      ; ввод символа без показа
     int 21h
     cmp AL, 13     ; Enter нажали ?
     je Oxid_vihod  ; да - уходим
     cmp AL, '9'
     ja my_input    ; какую-то бОльшую букву ввели - игнорируем
     cmp AL, '0'
     jb my_input    ; какую-то меньшую букву ввели - игнорируем
    
     mov AH, 2
     mov DL, AL     ; цифра
     int 21h        ; выводим цифру
     sub AL, '0'    ; преобразуем символ в число 0..9
     xor AH, AH     ; AH = 0
     mov CX, AX     ; цифра теперь в CX
     mov AX, DI     ; в AX наш итог
     mov BX, 10     ; десятичная у нас система ввода
     mul BX         ; AX = AX*10
     add AX, CX     ; добавим нашу цифру
     mov DI, AX     ; результат в DI
     jmp my_input   ; на следующую цифру
    Oxid_vihod:
     mov CX, DI     ; запишем результат
     RET ; валим
    MY_SCAN_NUM ENDP
;------------
 
; процедура CLEAR_SCREEN
    CLEAR_SCREEN PROC NEAR
    PUSH    AX      ; store registers...
    PUSH    DS      ;
    PUSH    BX      ;
    PUSH    CX      ;
    PUSH    DI      ;
    
    MOV     AX, 40h
    MOV     DS, AX  ; for getting screen parameters.
    MOV     AH, 06h ; scroll up function id.
    MOV     AL, 0   ; scroll all lines!
    MOV     BH, 07  ; attribute for new lines.
    MOV     CH, 0   ; upper row.
    MOV     CL, 0   ; upper col.
    MOV     DI, 84h ; rows on screen -1,
    MOV     DH, [DI] ; lower row (byte).
    MOV     DI, 4Ah ; columns on screen,
    MOV     DL, [DI]
    DEC     DL      ; lower col.
    INT     10h
    
    ; set cursor position to top
    ; of the screen:
    MOV     BH, 0   ; current page.
    MOV     DL, 0   ; col.
    MOV     DH, 0   ; row.
    MOV     AH, 02
    INT     10h
    
    POP     DI      ; re-store registers...
    POP     CX      ;
    POP     BX      ;
    POP     DS      ;
    POP     AX      ;
    
    RET
    CLEAR_SCREEN ENDP
 
vivod_cisla proc
      
xor cx, cx
mov bx, 10
oi2:
xor dx,dx
div bx
push dx
inc  cx
test ax, ax
jnz oi2
mov ah, 02h
oi3:
pop dx
add dl, '0'
int 21h
loop oi3
    
ret
 
vivod_cisla endp
    
    dlina dw 0
    shirina dw 0
    xkord dw 0
    ykord dw 0
    plosiad dw 0
    perimetr dw 0  
    msg1 db 'Pogrammu napisal: Imia Familija. Nazmite <Enter> ', '$'
    msg2 db 'Vvedite X koordinatu centra priamougolnika: ', '$'
    msg3 db 'Vvedite Y koordinatu centra priamougolnika: ', '$'
    msg4 db 'Vvedite shirinu priamougolnika (max 480): ', '$'
    msg5 db 'Vvedite dlinu priamougolnika (max 640): ', '$'
    msg6 db 'Plosiad Vashego priamougolnika: ', '$'
    msg7 db 'Perimetr vashego priamougolnika: ', '$'
    msg8 db 'Dlia sozdanija priamougolnika nazmite <ENTER>', '$'
    
    p1 dw 0 ;конец верхней линии x
    p2 dw 0 ;конец левой линии y
    p3 dw 0 ;конец нижней линии x
    p4 dw 0 ;конец правой линии y
  
    end

PM MAIL   Вверх
Oxidous
Дата 28.12.2015, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



И ещё такой вопрос
Есть второй вариант этого задания - Для ввода\ вывода использовать прерывание (INT). Не использовать никаких emu, macro и т.п. команд.
2 вариант: Пользователь вводит координаты верхнего левого (x1, y1) и правого нижнего (x2, y2)углов прямоугольника. Нужно начертить на экране прямоугольник и вывести на экран его площадь (S) и периметр (P).

Периметр и площадь, вроде как, некорректно считаются для второго варианта, а потому нужно, чтоб из координат второй точки вычитались координаты первой точки.
Допустим, пусть координаты первой точки (x1, y1) будут 10 и 10, а координаты второй точки (x2, y2) 100 и 100. Тогда вычитаем первую точку из второй (100-10 и 100-10), получаем 90 и 90, и уже по этим полученным значениям считаем периметр и площадь прямоугольника.

Вот код вводимых координат первой точки: 

Код

; вводим значения первой координаты
; x1
mov dx, offset msg2
mov ah, 9
int 21h
call scan_num
 
mov xkord, cx
 
call clear_screen
; y1
mov dx, offset msg3
mov ah, 9
int 21h
call scan_num
 
mov ykord, cx


Вот код вводимых координат второй точки: 

Код

; вводим значения второй координаты
; x2
mov dx, offset msg4
mov ah, 9
int 21h
call scan_num
 
mov x2kord, cx
 
call clear_screen
 
; y2
mov dx, offset msg5
mov ah, 9
int 21h
call scan_num
 
mov y2kord, cx


Вот код периметра и площади прямоугольника:

Код

; периметр прямоугольника
mov bx, x2kord
add bx, y2kord
add bx, bx
mov perimetr, bx 
 
; площадь прямоугольника
mov ax, y2kord
mul x2kord
mov plotas, ax


Как я понимаю, первые координаты записываются в CX регистр. Как в мне в периметре и площади прямоугольника вычесть из значений второй координаты значения первой координаты?
Я понимаю, что это делается командой SUB CX, BX, но при работе программы периметр и площаль остаются такими же, как при умножении значений второй координаты для площади(a*b)и 2*(a+b) - для периметра.

Со всем разобрался. Тема больше не актуальна. Благодарю за помощь smile

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

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

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


 




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


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

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