Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2023, 10:46   #1
ChestIotVaga
Пользователь
 
Регистрация: 21.11.2022
Сообщений: 84
Смех как в векторную графику на картинке написать название и автора указать tasm

Ребят нужна помощь как мне в мой код добавить на картинку космического карабля который нарисован векторной графикой на картинке написать название и автора указать помогите мне!
Код:
    .model small
    .stack
    .code
 
xc  equ word ptr [bp+10]
yc  equ word ptr [bp+8]
rad equ word ptr [bp+6]
color   equ byte ptr [bp+4]
 
; внутренние переменные
; эти переменные существуют только в процессе работы процедуры
circX   equ word ptr [bp-2]
circY   equ word ptr [bp-4]
circD   equ word ptr [bp-6]
 
if 1
; вывод точки
; x=cx, y=dx, color=al
plot:   push di
    push es
    cmp cx,320 ; координаты выходят за границы экрана ?
    jnc pl1
    cmp dx,200
    jnc pl1
    push ax
    mov ax,320 ; di=320*y+x
    mul dx
    add ax,cx
    mov di,ax
    mov ax,0A000h
    mov es,ax
    pop ax
    mov es:[di],al ; выводим точку
pl1:    pop es
    pop di
    ret
endif
 
drawCircle:
;    putpixel(xc+x, yc+y, RED)
    mov cx,xc
    add cx,circx
    mov dx,yc
    add dx,circy
        call plot
;    putpixel(xc-x, yc+y, RED)
    mov cx,xc
    sub cx,circx
    mov dx,yc
    add dx,circy
        call plot
;    putpixel(xc+x, yc-y, RED)
    mov cx,xc
    add cx,circx
    mov dx,yc
    sub dx,circy
        call plot
;    putpixel(xc-x, yc-y, RED)
    mov cx,xc
    sub cx,circx
    mov dx,yc
    sub dx,circy
        call plot
;    putpixel(xc+y, yc+x, RED)
    mov cx,xc
    add cx,circy
    mov dx,yc
    add dx,circx
        call plot
;    putpixel(xc-y, yc+x, RED)
    mov cx,xc
    sub cx,circy
    mov dx,yc
    add dx,circx
        call plot
;    putpixel(xc+y, yc-x, RED)
    mov cx,xc
    add cx,circy
    mov dx,yc
    sub dx,circx
        call plot
;    putpixel(xc-y, yc-x, RED)
    mov cx,xc
    sub cx,circy
    mov dx,yc
    sub dx,circx
        call plot
    ret
 
circle  proc
    push bp   ; пролог Сохраняем bp в стеке
    mov bp,sp ; далее мы адресуем переменные с помощью bp
    sub sp,16 ; выделяем место под локальные переменные
    push ax
    push bx
    push cx
    push dx
 
;x = 0: y = r
;d = 3 - 2 * r
;drawCircle(xc, yc, x, y)
    mov ax,0
    mov circx,ax
    mov ax,rad
    mov circy,ax
    mov ax,rad
    add ax,ax
    sub ax,3
    neg ax
    mov circd,ax
    mov al,color
    call drawCircle
; while (y >= x)
circle0:mov ax,circy
    cmp ax,circx
    jl circle1
; x=x+1
    inc circx
;' update d, x, y
;if (d > 0) then
;   y=y-1:d = d + 4 * (x - y) + 10
;else
;        d = d + 4 * x + 6
;end if
    cmp circd,0
    jle circle2
    dec circy
    mov ax,circx
    sub ax,circy
    add ax,ax
    add ax,ax
    add ax,circd
    add ax,10
    mov circd,ax
    jmp circle3
circle2:mov ax,circx
    add ax,ax
    add ax,ax
    add ax,circd
    add ax,6
    mov circd,ax
circle3:
; drawCircle(xc, yc, x, y)
    mov al,color
    call drawCircle
; wend
    jmp circle0
circle1:
    pop dx
    pop cx
    pop bx
    pop ax
    mov sp,bp ; эпилог, восстанавливаем sp
    pop bp    ; восстанавливаем bp
    ret 8    ; делаем возврат и продвигаем стек на 4*2=8 байт (т к 4 аргументов хранилось в стеке)
circle  endp
 
; ******** drawline ********
 
; аргументы вызова - координаты линии и цвет
; эти переменные заносятся в стек перед вызовом drawline
; см invoke
x1  equ word ptr [bp+12]
y1  equ word ptr [bp+10]
x2  equ word ptr [bp+8]
y2  equ word ptr [bp+6]
col equ byte ptr [bp+4]
 
; внутренние переменные drawline
; эти переменные существуют только в процессе работы drawline
deltaX  equ word ptr [bp-2]
deltaY  equ word ptr [bp-4]
signX   equ word ptr [bp-6]
signY   equ word ptr [bp-8]
er  equ word ptr [bp-10]
er2 equ word ptr [bp-12]
 
; вывод линии
; SUB drawLine (x1, y1, x2, y2, col)
; Пример вызова:
; invoke drawline, <10,10,310,10,15>
 
drawline proc
    push bp   ; пролог Сохраняем bp в стеке
    mov bp,sp ; далее мы адресуем переменные с помощью bp
    sub sp,16 ; выделяем место под локальные переменные
    push ax
    push bx
    push cx
    push dx
;deltaX = ABS(x2 - x1)
    mov ax,x2
    sub ax,x1
    jge lin1
    neg ax
lin1:   mov deltaX,ax
;deltaY = ABS(y2 - y1)
    mov ax,y2
    sub ax,y1
    jge lin2
    neg ax
lin2:   mov deltaY,ax
;IF x1 < x2 THEN signX = 1 ELSE signX = -1
    mov bx,1
    mov ax,x1
    cmp ax,x2
    JL  lin3
    neg bx
lin3:   mov signX,bx
;iF y1 < y2 THEN signY = 1 ELSE signY = -1
    mov bx,1
    mov ax,y1
    cmp ax,y2
    JL  lin4
    neg bx
lin4:   mov signY,bx
;er = deltaX - deltaY
    mov ax,deltaX
    sub ax,deltaY
    mov er,ax
;PSET (x2, y2), col
    mov cx,x2
    mov dx,y2
    mov al,col
    call plot
; основной цикл построения линии
;WHILE (x1 <> x2) OR (y1 <> y2)
wil1:   mov ax,x1
    cmp ax,x2
    jnz wil2
    mov ax,y1
    cmp ax,y2
    jnz wil2
    jmp wend
wil2:   
;PSET (x1, y1), col
    mov cx,x1
    mov dx,y1
    mov al,col
    call plot
;er2 = er * 2
    mov ax,er
    add ax,ax
    mov er2,ax
;IF (er2 > -deltaY) THEN er = er - deltaY: x1 = x1 + signX
    mov ax,er2
    add ax,deltaY
    JLE lin5
    mov ax,er
    sub ax,deltaY
    mov er,ax
    mov ax,x1
    add ax,signX
    mov x1,ax
lin5:
;IF (er2 < deltaX) THEN er = er + deltaX: y1 = y1 + signY
    mov ax,er2
    cmp ax,deltaX
    jge lin6
    mov ax,er
    add ax,deltaX
    mov er,ax
    mov ax,y1
    add ax,signY
    mov y1,ax
;WEND
lin6:   jmp wil1
wend:   pop dx
    pop cx
    pop bx
    pop ax
    mov sp,bp ; эпилог, восстанавливаем sp
    pop bp    ; восстанавливаем bp
    ret 10    ; делаем возврат и продвигаем стек на 5*2=10 байт (т к 5 аргументов хранилось в стеке)
drawline endp
 
if 1
; макро вызова drawline См lst.lst, какой код генерит это макро
 
invoke macro CallProc,Params
    IRP P,<Params>
        mov ax, P
        push ax
        
    endm
    call CallProc
endm
 
bgfill: push es
    mov di,0A000h
    mov es,di
    mov al,11
    mov ah,al
    mov cx,320*100
    mov di,0
    cld
    rep stosw
    pop es
    ret
 
 
start:  push cs
    pop  ds
    push cs
    pop  es
; граф режим 320*200*256 цветов 
    mov ax,13h
    int 10h
; цвет неба
    call bgfill
; ракета
    invoke drawline, <70,128,171,79,0>
        invoke drawline, <171,79,208,76,0>
        invoke drawline, <208,76,192,107,0>
        invoke drawline, <192,107,93,160,0>
        invoke drawline, <93,160,70,128,0>
        invoke drawline, <171,79,192,107,0>
; боковые треугольники
    invoke drawline, <70,128,44,115,0>
    invoke drawline, <44,115,93,116,0>
 
        invoke drawline, <93,160,96,185,0>
        invoke drawline, <96,185,115,150,0>
; центральный треугольник
        invoke drawline, <104,134,67,163,0>
        invoke drawline, <104,134,53,144,0>
        invoke drawline, <67,163,53,144,0>
; окна
        invoke circle,<160,103,10,0>
        invoke circle,<128,120,10,0>
; солнышко
    mov cx,30
m1:     invoke circle,<270,45,cx,14>
        invoke circle,<271,45,cx,14>
    loop m1
; ожидание нажатия на клавишу
    mov ah,0
    int 16h
; текстовый режим
    mov ax,3
    int 10h
; выход в дос
    mov ax,4C00h
    int 21h
endif
    end start
ChestIotVaga вне форума Ответить с цитированием
Старый 06.04.2023, 10:46   #2
ChestIotVaga
Пользователь
 
Регистрация: 21.11.2022
Сообщений: 84
По умолчанию

думал как то так но не получается mov ah, 13h ; BIOS команда вывода символа
mov al, 'к' ; выводим первый символ
mov cx, 1 ; выводим 1 раз
mov dx, 140 ; координаты начала вывода текста по X и Y
int 10h ; выводим символ
inc dx ; увеличиваем координату X на 1

mov al, 'о' ; выводим следующий символ
int 10h
inc dx

mov al, 'с' ; выводим следующий символ
int 10h
inc dx

mov al, 'м' ; выводим следующий символ
int 10h
inc dx

mov al, 'и' ; выводим следующий символ
int 10h
inc dx

mov al, 'ч' ; выводим следующий символ
int 10h
inc dx

mov al, 'е' ; выводим следующий символ
int 10h
inc dx

mov al, 'с' ; выводим следующий символ
int 10h
inc dx

mov al, 'к' ; выводим следующий символ
int 10h
inc dx

mov al, 'и' ; выводим следующий символ
int 10h
inc dx

mov al, 'й' ; выводим следующий символ
int 10h
ChestIotVaga вне форума Ответить с цитированием
Старый 06.04.2023, 11:09   #3
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Текст надо рисовать по точкам. Изображения первых 128 символов (латинский алфавит) можно считать по адресу 0F000h:0FA6Eh или можете получить указатель на таблицу символов знакогенератора вызвав функцию AX=01130h.
Как работать с символами знакогенератора можете посмотреть здесь и здесь
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите как добавить надпись в картинку по заданию надо нарисовать дом и указать автора ChestIotVaga Помощь студентам 2 23.02.2023 04:23
Поддерживает ли Unity векторную графику? Мaкс Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 22.06.2018 16:04
Найти название книг автора, изданных с определенного года Zepko Помощь студентам 0 16.09.2015 20:44
Даны сведения о книгах в библиотеке: фамилия автора, название книги и год издания. Напечатать автора и название книг, го greshnik92 Общие вопросы C/C++ 3 21.06.2011 10:45