Вопрос № 19576: Здравствуйте, господа! Подскажите, как в ассемблерной программе для dos получить параметры из командной строки. Если можно, с примером кода. Спасибо....Вопрос № 19606: Здравствуйте!
Ни разу не приходилось с созданием графики на ассемблере. Необходимо сделать следующее:
Составить программу для 16-разрядного процессора, реализующую следующие возможности:
Быстрый показ двух разных произвольных изображений,...
Вопрос № 19576
Здравствуйте, господа! Подскажите, как в ассемблерной программе для dos получить параметры из командной строки. Если можно, с примером кода. Спасибо.
Отправлен: 12.04.2005, 15:50
Вопрос задал: Белоусов Алексей Юрьевич (статус: 1-ый класс)
Всего ответов отправлено: 1
Отвечает: Евгений Иванов
Здравствуйте, Белоусов Алексей Юрьевич!
AdrCmdLine = 128 ;начало командной строки
cmdstr1:
mov si,AdrCmdLine
lodsb
or al,al
jz help
mov cl,al
sub ch,ch
push si cx ;увеличиваем регистр букв (делаем одинаковыми)
mov bx,ofs tabl_small_big
mov di,si
m101a:
lodsb
xlat
stosb
dec cx
jnz m101a
pop cx si
mov ah,79
mov di,ofs name1
call get_name
jc help
cmp [w name1],'?/'
jz help
;==============
;IN:AH=максим.размер буфера,куда переписывать данные командной строки.
;DS:DI=адрес буфера.
;DS:SI=адрес начала участка командной строки.
;CX=размер оставшейся части командной строки.
;OUT:CF=1-ошибка,код ошибки в AL(0-нет символов,1-переполнение буфера)
;CF=0-все хорошо.
;AH=число символов скопированных.
proc get_name ;=1g
push bx ax
xor bx,bx
jcxz m171g
m151g:
lodsb
cmp al,33
jnc m201g
loop m151g
m171g:
pop ax
mov al,0
exit_g_n2:
push ax
stc
jmp exit_g_n
m161g:
pop ax
mov al,1
jmp exit_g_n2
m201g:
dec si
inc ah
m251g:
lodsb
cmp al,33
jc m271g
dec ah
jz m161g
dec cx
stosb
inc bx
jmp m251g
m271g:
dec si
pop ax
mov ah,bl
push ax
clc
exit_g_n:
mov al,0
stosb
pop ax bx
ret
endp
tabl_small_big:
db 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
db 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
db 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47
db 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63
db 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79
db 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95
db 96,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79
db 80,81,82,83,84,85,86,87,88,89,90,123,124,125,126,127
db 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143
db 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159
db 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143
c_1 = 176
rept 3*16
db c_1
c_1 = c_1+1
endm
db 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159
db 240,240,242,243,244,245,246,247,248,249,250,251,252,253,254,255
Прикреплённый файл: Загрузить >> Срок хранения файла на сервере RusFAQ.ru составляет 14 суток с момента отправки ответа.
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 12.04.2005, 18:54
Вопрос № 19606
Здравствуйте!
Ни разу не приходилось с созданием графики на ассемблере. Необходимо сделать следующее:
Составить программу для 16-разрядного процессора, реализующую следующие возможности:
Быстрый показ двух разных произвольных изображений, изменяя одно, пока на экране находится другое, своего рода эффект плавной анимации.
Просьба, набросайте что-то простенькое.
Спасибо.
Отправлен: 12.04.2005, 22:59
Вопрос задал: MMM72 (статус: Посетитель)
Всего ответов отправлено: 1
Отвечает: Евгений Иванов
Здравствуйте, MMM72!
Это небольшой кусочек двух подпрограмм из игры Калах.
http://superforest.narod.ru/rar/kalah.rar
;Записывает экран в память;
;IN -> SI-адрес параметров (4 слова:координаты прямоугольника X1,Y1,X2,Y2);
;OUT -> AX-сегмент памяти с сохраненным экраном;
proc SaveScrToMem ;====================================================
pusha
push si
lodsw
mov cx,ax
xchg ax,di
shr di,3
mov ax,Xmax/8
mul wptr [si]
add di,ax
lodsw
xchg ax,dx
lodsw
sub ax,cx
ror ax,3
or ah,ah
jnz @@m1
dec ax
@m1:
inc ax
sub ah,ah
xchg ax,cx
lodsw
sub ax,dx
inc ax
mov bx,ax
push ax
;CX-количество байт по X,BX-количество строк по Y,DI-адрес начала;
mul cx
add ax,1 ;4 байта:2-адрес параметров,2-адрес видеопамяти
adc dx,0
mov bx,4
div bx
inc ax
mov bx,ax ;Выделим память для 4 слоев
mov ah,48h
int 33
jc err_mem_gr
mov wptr [bp+Zip1-dat],ax
pop bx dx
push ds es es
pop ds
mov es,ax
mov si,di
sub di,di
mov ax,3CEh
xchg ax,dx
stosw ;Адрес параметров
mov ax,si
stosw ;Адрес видеопамяти
mov ax,304h ;Начнем с 3 слоя
push bp
mov bp,cx
@m5:
push ax bx si
out dx,ax
mov ax,Xmax/8
sub ax,bp
@m6:
mov cx,bp
add cx,di
jc @@m7
mov cx,bp
@m8:
rep movsb
add si,ax
dec bx
jnz @@m6
pop si bx ax
dec ah
jns @@m5 ;И завершим 0-ым
pop bp es ds
popa
mov ax,wptr [bp+Zip1-dat]
ret
@m7:
mov cx,di
neg cx
push cx
rep movsb
mov cx,es
add cx,1000h
mov es,cx
pop cx
sub cx,bp
neg cx
jmp @@m8
endp
;Выводит на экран из памяти для сегмента AX;
;! Пока без масок в начале и в конце,позже сделать;
;IN -> AX-сегмент памяти с экраном;
proc LoadMemToScr ;====================================================
pusha
push ds ax
pop ds
sub si,si
lodsw
xchg ax,bx
lodsw
xchg ax,di
mov si,bx
lods wptr [ss:si]
xchg ax,cx
lods wptr [ss:si]
xchg ax,dx
lods wptr [ss:si]
sub ax,cx
ror ax,3
or ah,ah
jnz @@m1
dec ax
@m1:
inc ax
sub ah,ah
xchg ax,cx
lods wptr [ss:si]
sub ax,dx
inc ax
xchg ax,bx
; CX-байт на линию,BX-линий,DI-адрес видеопамяти
mov si,4
mov dx,3C4h
mov ax,802h
push bp
mov bp,cx
@m5:
push di bx ax
out dx,ax
mov ax,Xmax/8
sub ax,bp
@m6:
mov cx,bp
add cx,si
jc @@m7
mov cx,bp
@m8:
rep movsb
add di,ax
dec bx
jnz @@m6
pop ax bx di
shr ah,1
jnc @@m5
mov ah,0Fh
out dx,ax
;D маску...
pop bp ds
popa
ret
@m7:
mov cx,si
neg cx
push cx
rep movsb
mov cx,ds
add cx,1000h
mov ds,cx
pop cx
sub cx,bp
neg cx
jmp @@m8
endp
Прикреплённый файл: Загрузить >> Срок хранения файла на сервере RusFAQ.ru составляет 14 суток с момента отправки ответа.
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 13.04.2005, 05:58