- 1
- 2
- 3
- 4
- 5
- 6
vbi:
mov %al [[email protected]]
inc %al
mov [[email protected]] %al
.mset: memset [@T1] 3A98h 0h
rei
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
vbi:
mov %al [[email protected]]
inc %al
mov [[email protected]] %al
.mset: memset [@T1] 3A98h 0h
rei
0
.org 80h
inc:
push %bp
mov %bp %sp
sub %sp 0010h
mov [%bp + FFFEh] %sp
mov [%bp + FFFCh] %b
lea %a [%bp + FFFCh]
mov %a [%a]
push %a
inc %a
pop %si
mov [%si] %a
jmp @.return.inc
.return.inc:
mov %sp %bp
pop %bp
ret
main:
push %bp
mov %bp %sp
sub %sp 0010h
mov [%bp + FFFCh] %sp
memset [%bp + FFFEh] 0002h 0h
lea %a [%bp + FFFEh]
push %a
mov %a 0000h
pop %si
mov [%si] %a
.L.begin.1:
mov %a 0001h
cmp %a 0h
jz @.0
lea %a [%bp + FFFEh]
push %a
pop %b
call @inc
push %a
mov %a 0050h
pop %si
cmp %si %a
jgz @.compare3
mov %al 1h
.compare3:
mov %ah 0h
cmp %a 0h
jz @.else.2
jmp @.0
jmp @.end.2
.else.2:
.end.2:
.1:
jmp @.L.begin.1
.0:
.return.main:
mov %sp %bp
pop %bp
ret
start:
mov %sp FFFFh
call @main
.return.start:
int 0h
<-------------------->
short inc(short* i)
{
return ++(*i);
}
void main(void)
{
short i = 0s;
while(1)
{
if(inc(&i) > 0x50)
break;
}
}
void start(void)
{
asm("mov %sp FFFFh");
main();
}
да что вы знаете о неоптимизированном коде
−2
; %ch - x1, %cl - y1, %dh - x2, %dl - y2 ;
drawline:
push %a
push %b
push %c
push %d
push %e
mov %al %dh
sub %al %ch
call @abs
mov %ah %al ; ah - dX ;
mov %al %dl
sub %al %cl
call @abs
neg %al ; al - -dY ;
mov %bh FFh ; bh - signX;
mov %bl FFh ; bl - signY ;
cmp %ch %dh
jgz @.S1
neg %bh
.S1:
cmp %cl %dl
jgz @.S2
neg %bl
.S2:
mov %el %ah
add %el %al ; el - error ;
push %d
call @drawpixel
pop %d
.loop:
cmp %ch %dh
jnz @.L1
cmp %cl %dl
jnz @.L1
jmp @.loop_end
.L1:
push %c
call @drawpixel
pop %c
mov %eh %el
cmp %eh %al
jng @.L2
add %el %al
add %ch %bh
.L2:
cmp %eh %ah
jgz @.loop
add %el %ah
add %cl %bl
jmp @.loop
.loop_end:
pop %e
pop %d
pop %c
pop %b
pop %a
ret
https://pastebin.com/k8697fae
алгоритм брезенхема.
результат: https://imgur.com/a/c1twuNt
забавно что посреди тестов программа выдала красивые такие кривые на весь экран. с.м. имгур, приложил.
+1
.org 22h
dw @vbi
.org 80h
bpos: db 0h 0h
vector: db 2h 1h
process:
push %a
push %b
mov %a [@bpos] ; {h:x, l:y} ;
mov %b [@vector] ; {h:dx, l:dy} ;
add %ah %bh
add %al %bl
cmp %ah 11h
jng @.skip_xoverflow_handle
cmp %ah 14h
jg @.overflow_left
mov %ah 11h
jmp @.xoverflow_finally
.overflow_left:
mov %ah 0h
.xoverflow_finally:
neg %bh
.skip_xoverflow_handle:
cmp %al 5Ch
jng @.skip_yoverflow_handle
cmp %al 60h
jg @.overflow_up
mov %al 5Bh
jmp @.yoverflow_finally
.overflow_up:
mov %al 1h
.yoverflow_finally:
neg %bl
.skip_yoverflow_handle:
mov [@bpos] %a
mov [@vector] %b
pop %b
pop %a
ret
cls:
push %a
push %b
mov %a 3A98h
.loop:
mov [%a + @T1] 0000h
sub %a 2h
jnz @.loop
pop %b
pop %a
ret
render:
push %a
push %b
push %c
mov %a [@bpos] ; {h:x, l:y} ;
mov %b %al
mul %b 12h
add %b %ah
add %b @T1
mov %c 8h
.loop:
movb [%b] FFh
add %b 12h
dec %c
jnz @.loop
pop %c
pop %b
pop %a
ret
start:
mov %sp FFFFh
outb 20h 1h
outb 21h 16h
out 22h @T1
mov %al 1h
int 10h
.loop:
jmp @.loop
vbi:
call @cls
call @render
call @process
ret
.org 1000h
T1:
решил пойти по накатанному пути и добавил видеоконтроллер, пока только монохромная битовая карта 144x100, но большего и не надо
сабж выводит на экран что отпрыгивает от стен, простое умножение компонента вектора на -1
0
.org 80h
data:
db "Hello, world!\n"
wait:
.loop:
inb %cl E9h
cmp %cl 0h
jnz @.loop
ret
start:
mov %sp 300h
.loop:
mov %al [%b + @data]
inc %b
outb E9h %al
call @wait
cmp %al Ah
jnz @.loop
int 0h
забацал port-mapped io, работает в отдельном потоке
sudo bormand
0
.org 80h
data:
db "Hello, world!\n"
db 0h
start:
mov %bp @data
; jmp @.exit ;
.loop:
mov %al [%si + %bp]
inc %si
cmp %al 0h
int 5h ;KOKOKO make me port-mapped io;
jnz @.loop
.exit:
int 0h
32 31 44 41 54 41 3A 30 30 38 30 3B 53 54 41 52
54 3A 30 30 38 45 3B 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 48 65 6C 6C 6F 20 77 6F 72
6C 64 21 0A 00 02 06 80 00 03 0A 38 09 05 0C 0A
00 00 0B 05 0F 92 00 0B 00
добавил комментарии, теперь можно будет красиво рисовать фреймы (радуйтесь)
0
.org 80h
fib:
push %b
push %d
push %c
mov %d [%sp + 8h]
mov %b 1h
mov %a 0h
.loop:
add %b %a
mov %c %a
mov %a %b
sub %a %c
dec %d
jnz @.loop
pop %c
pop %d
pop %b
ret
start:
mov %sp 2000h
push Fh
call @fib
pop
int 0h
один чел захотел написать для моей вмки компилятор лиспоподобного языка с некими S-выражениями и попросил пример вычисления ряда фибоначчи.
пришлось накопипастить с вики.
−8
.MODEL small ;отводим под стек и под данные по 64Кб код занимает 1 сегмент, данные и стек обьеденены в одну группу
.STACK 100h ;отмечаем начало сегмента стека
.DATA ;отмечаем начало сегмента данных
_STDOUT_ equ 1 ; из синтаксического описания видно, что с помощью equ идентификатору
;можно ставить в соответствие как числовые выражения, так и текстовые строки,
;а псевдооператор “=” может использоваться только с числовыми выражениями;
vivod db 0Dh, 0Ah, '$' ; $-кон. стр.
String db 82 dup(?); выделение памяти для строки
PosLen db 14 dup(?); выделение памяти для строки (числа)
Pos dw ? ; память для первого числа
Len dw ? ; для второго
.CODE ;отмечаем начало сегмента кодов
preob proc ; процедура преобразования из строки в число
xor ax, ax
mov bx, ax
mov cx, 10 ; для реализации цикла
_repeat:
mov bl, [si] ; помещаем в bl символ строки
inc si ; в si переходим к ячейке следующего символа
sub bl, '0'; преобразуем ASCII код в число
jb _break ; если SF = 1 то выходим из процедуры(указывает, что между числами стоит пробел, числовой код пробела меньше числового кода нуля)
cmp bl, 9 ; сравниваем, если число больше 9 - то это символ - идём на выход
ja _break
mul cx
add ax, bx ;прибавляет в регистр ax нужное число
jmp _repeat
_break:
ret ; возврат в в главный код
preob endp
main PROC
;инициализация сегментного регистра ds адресом сегмента данных
mov ax, @data
mov ds, ax
;ввод строки
mov [String], byte ptr 80
mov ah, 0Ah
lea dx, [String]
int 21h
;ввод строки чисел
mov al,10 ; перенос строки
int 29h ; быстрый вывод символов на экр(экон байт)
mov [PosLen], byte ptr 14
mov ah, 0Ah
lea dx, [PosLen]
int 21h
;преобразование строки в первое число
lea si, [PosLen+2]
call preob
mov [Pos], ax
call preob
mov [Len], ax
mov al,10 ; перенос строки
int 29h ; быстрый вывод символов на экр(экон байт)
mov ah, 40h ;номер функции помещается в ah
mov bx, _STDOUT_ ;в bx хранится дескриптор стандартного выходного потока
mov cx, [Len] ; кол-во выводимых символов
lea dx, [String+1] ; адрес буфера вывода
add dx, [Pos] ; берем 1 сим. и добавляем число, чтобы перейти к нужному нам символу
int 21h
;завершение программы
xor ax,ax
int 16h
mov ax,4c00h
int 21h
MAIN ENDP
END MAIN
Помогите разобраться в коде, понять логику
Задание: Ввести с клавиатуры строку и строку из двух чисел. Первое число ука- зывает начало подстроки для ввода на экран, второе количество символов из пер- вой строки, которое необходимо вывести на экран.
0
.org 80h
data:
db "Hello, world!\n"
db 0
start:
mov %c 1h
mov %bp @data
mov %si 0
.loop:
mov %al [%si + %bp]
inc %si
cmp %al 0h
jz @.exit
int 5h
jmp @.loop
.exit:
int 0h
0080 48 65 6C 6C 6F 20 77 6F 72 6C 64 21 0A 00 02 02
0090 01 00 02 06 80 00 02 05 00 00 03 0A 38 09 05 0C
00A0 0A 00 00 0E AB 00 0B 05 0D 9A 00 0B 00 00 00 00
накодил виртуальную машину, заспидранил Hello World за четыре дня. рекорд.
https://github.com/kcalbSphere/PVC-16
+1
.ALIAS HALT 10h
.ALIAS VBI 0h
.ALIAS VPUSCRADDR 3000h
.ALIAS VPUATRADDR 3002h
.ALIAS VPUCTRL 3004h
.ALIAS VPUCTRL_WH 3005h
.ALIAS VPUCTRL_F 3006h
.ALIAS VPUCTRL_VBI 0
.ALIAS VPUCTRL_ACT 1
.ALIAS VPUCTRL_TICK 2
.ALIAS W 10
.ALIAS H 5
.ALIAS I %BL
.ALIAS PTR %C
.ORG 2000h SCR:
.ORG 2100h ATR:
.ORG #VBI
DD @VBI
.ORG 30h
DATA:
.ORG 40h
STATE:
X: DB 0
.ORG 80h
_START:
SET %AL #VPUCTRL_VBI
SET %AL #VPUCTRL_ACT
STORE %AL #VPUCTRL_F
MOV %AL #H
SHL %AL 4
OR %AL #W
STORE %AL #VPUCTRL_WH
MOV %A @SCR
STORE %A #VPUSCRADDR
MOV %A @ATR
STORE %A #VPUATRADDR
LOAD %AL #VPUCTRL_F
SET %AL #VPUCTRL_TICK
STORE %AL #VPUCTRL_F
STORE %AL #VPUCTRL_F
LOOP:
JMP @LOOP
VBI:
PUSH %A
PUSH %B
PUSH %C
LOAD %AL @X
ADD %AL 1
CMP %AL #W JNE @VBI_CONTINUE
XOR %AL %AL VBI_CONTINUE:
STORE %AL @X
CMP %AL 0 JNE @VBI_ELSE
MOV #PTR @SCR
ADD #PTR #W
SUB #PTR 1
STORE #PTR %AL
JMP @VBI_SKIP
VBI_ELSE:
MOV #PTR @SCR
ADD #PTR %AL
SUB #PTR 1
MOV %BH 0
STORE #PTR %BH
VBI_SKIP:
MOV #PTR @SCR
ADD #PTR %AL
MOV %BH FFh
STORE #PTR %BH
POP %C
POP %B
POP %A
RET
похождения моей ебанутой вмки продолжаются.
bormand сказало что писать подставным прерыванием в консольку это читерство. реализовал видеовывод. теперь нормально? (слегка криво, и на
атрибуты вмке похуй, как и мне.)
вопреки моим огромным сомнениям, выдает 600 фпс даже на моей скромной конфигурации.
https://imgur.com/fdLlQvx