LINUX.ORG.RU

Кратко про нейронные сети. Тестирование

 


0

1

Попросил переписать код на Ассемблере NASM alice.yandex.ru и deep.org

#include <stdio.h>
int main (void) {
int i, a;
/*Дерево*/
char  color_str[28][299] = {"*#*=*#+:+#@@####*+#@@@%%+#@@%%%%%*+#%%*.\n",
    "*%##%#+#@@@@**@*%@@%#***%@%%@@#####@@%%\n",
    "+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n",
    "+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n",
    "%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n",
    "%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n",
    "*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n",
    "*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n",
    "%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%\n*",
    "%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%*\n",
    "@@#+*%@@@@@%%**#%##%%%@@@@%##%%#%@%#@%%@\n",
    "%@%*+##*#@%#%*#@%%%%%@@@*##+*%@@#%%%%##*\n",
    "#++#+*#@%@%++#%%%%%%%@@%=*%@#%#+#%@@@@%%\n",
    "*%%##**######%%#@%%%%%#%%##@@##%@@@@%##*\n",
    "##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n",
    "##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n",
    "####*==+%%%#@@#*@@@@@@%%@@%%+*##@@%#@#*#\n",
    "#%@@%%@@#%%*%@@@+#@@%%%%*#%%%@@#+%%*#%%%\n",
    "%%%%*#%%%#++#%@%@@@@%%%@%%@%--*@####%##%\n",
    "**#@@%**@%#+%%%*+#%#%@@@@@@@@@*=#*#%@##@\n",
    "%+*@@%##%@%+++*%%%%%%%@%*%@@#++%%@%*@@%*\n",
    "#####%%%@*++++++#####%%#++*@@%%@%*===*%%\n",
    "##**+#%**+++++=+####%%#======##+%*======\n",
    "%*+++===++++++===*###%*======*##+##++===\n",
    "***+++==+++++++==+#%%%#=====++++***+++++\n",
    "***+++++++++++++=+*##%#+++++++******++++\n",
    "***+++++++++++++++*%###++++++*******++++\n",
    "++++++++++++++***%#=%#*****+*********+++\n"    ,
};
for (a=0; a < 28; a++) {
i=0;
while((i <299) && color_str[a][i] != '\0' ) {
 
    /*Красим листья*/
    if(color_str[a][i] == '@')
    printf("\033[92m%c", color_str[a][i]);
    /*Сбрасываем цвет*/
        if(color_str[a][i] != '@')
    printf("\033[0m%c", color_str[a][i]);
                i++;
        }
    }
    return 0;
}

Переписали. Код запустить не удалось ни от одного, ни от другого. Алиса предложила вдобавок код на python, чтобы создать массив строк для Ассемблера. Но, конечно, советов разной ценности дали обе сети.

★

Последнее исправление: hobbit (всего исправлений: 6)

Правильно. Российские и китайские нейронки это прошлое нейросетей трёхгодичной и двухгодичной давности соответственно. Проси Claude и ChatGPT. Хотя даже тот ассистент от гугла справился и выдал мне:

section .data
    ; Коды сброса и смены цвета
    green_code  db 0x1B, "[92m"
    GREEN_LEN   equ $ - green_code
    
    reset_code  db 0x1B, "[0m"
    RESET_LEN   equ $ - reset_code

    ; Двумерный массив строк (размер каждой строки 299 байт, заполнено нулями)
    ; Использован директива TIMES для точного повторения структуры char color_str[28][299]
    color_str:
    db "*#*=*#+:+#@@####*+#@@@%%+#@@%%%%%*+#%%*.", 10, 0
    times 299 - ($ - color_str) db 0
    
    .str1: db "*%##%#+#@@@@**@*%@@%#***%@%%@@#####@@%%", 10, 0
    times 299 - ($ - .str1) db 0
    
    .str2: db "+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%", 10, 0
    times 299 - ($ - .str2) db 0
    
    .str3: db "+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%", 10, 0
    times 299 - ($ - .str3) db 0
    
    .str4: db "%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#", 10, 0
    times 299 - ($ - .str4) db 0
    
    .str5: db "%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#", 10, 0
    times 299 - ($ - .str5) db 0
    
    .str6: db "*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#", 10, 0
    times 299 - ($ - .str6) db 0
    
    .str7: db "*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#", 10, 0
    times 299 - ($ - .str7) db 0
    
    .str8: db "%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%", 10, "*", 0
    times 299 - ($ - .str8) db 0
    
    .str9: db "%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%*", 10, 0
    times 299 - ($ - .str9) db 0
    
    .str10: db "@@#+*%@@@@@%%**#%##%%%@@@@%##%%#%@%#@%%@", 10, 0
    times 299 - ($ - .str10) db 0
    
    .str11: db "%@%*+##*#@%#%*#@%%%%%@@@*##+*%@@#%%%%##*", 10, 0
    times 299 - ($ - .str11) db 0
    
    .str12: db "#++#+*#@%@%++#%%%%%%%@@%=*%@#%#+#%@@@@%%", 10, 0
    times 299 - ($ - .str12) db 0
    
    .str13: db "*%%##**######%%#@%%%%%#%%##@@##%@@@@%##*", 10, 0
    times 299 - ($ - .str13) db 0
    
    .str14: db "##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#", 10, 0
    times 299 - ($ - .str14) db 0
    
    .str15: db "##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#", 10, 0
    times 299 - ($ - .str15) db 0
    
    .str16: db "####*==+%%%#@@#*@@@@@@%%@@%%+*##@@%#@#*#", 10, 0
    times 299 - ($ - .str16) db 0
    
    .str17: db "#%@@%%@@#%%*%@@@+#@@%%%%*#%%%@@#+%%*#%%%", 10, 0
    times 299 - ($ - .str17) db 0
    
    .str18: db "%%%%*#%%%#++#%@%@@@@%%%@%%@%--*@####%##%", 10, 0
    times 299 - ($ - .str18) db 0
    
    .str19: db "**#@@%**@%#+%%%*+#%#%@@@@@@@@@*=#*#%@##@", 10, 0
    times 299 - ($ - .str19) db 0
    
    .str20: db "%+*@@%##%@%+++*%%%%%%%@%*%@@#++%%@%*@@%*", 10, 0
    times 299 - ($ - .str20) db 0
    
    .str21: db "#####%%%@*++++++#####%%#++*@@%%@%*===*%%", 10, 0
    times 299 - ($ - .str21) db 0
    
    .str22: db "##**+#%**+++++=+####%%#======##+%*======", 10, 0
    times 299 - ($ - .str22) db 0
    
    .str23: db "%*+++===++++++===*###%*======*##+##++===", 10, 0
    times 299 - ($ - .str23) db 0
    
    .str24: db "***+++==+++++++==+#%%%#=====++++***+++++", 10, 0
    times 299 - ($ - .str24) db 0
    
    .str25: db "***+++++++++++++=+*##%#+++++++******++++", 10, 0
    times 299 - ($ - .str25) db 0
    
    .str26: db "***+++++++++++++++*%###++++++*******++++", 10, 0
    times 299 - ($ - .str26) db 0
    
    .str27: db "++++++++++++++***%#=%#*****+*********+++", 10, 0
    times 299 - ($ - .str27) db 0

section .bss
    char_buf resb 1 ; Временный буфер для вывода одного символа

section .text
    global _start

_start:
    xor r12, r12        ; r12 = a (индекс строки от 0 до 27)

.loop_lines:
    cmp r12, 28
    jge .exit_program

    xor r13, r13        ; r13 = i (индекс символа в строке от 0 до 298)

.loop_chars:
    cmp r13, 299
    jge .next_line

    ; Вычисляем адрес: color_str + (a * 299) + i
    mov rax, 299
    mul r12             ; rax = a * 299
    add rax, r13        ; rax = (a * 299) + i
    lea rsi, [color_str + rax]
    
    mov dl, [rsi]       ; Загружаем текущий символ в dl
    
    cmp dl, 0           ; Проверка на '\0'
    je .next_line

    mov [char_buf], dl  ; Сохраняем символ в буфер для печати

    ; Проверяем, равен ли символ '@'
    cmp dl, '@'
    je .print_green

.print_reset:
    ; Печатаем код сброса цвета
    mov rax, 1          ; sys_write
    mov rdi, 1          ; stdout
    mov rsi, reset_code
    mov rdx, RESET_LEN
    syscall
    jmp .print_actual_char

.print_green:
    ; Печатаем код зеленого цвета
    mov rax, 1          ; sys_write
    mov rdi, 1          ; stdout
    mov rsi, green_code
    mov rdx, GREEN_LEN
    syscall

.print_actual_char:
    ; Печатаем сам символ
    mov rax, 1          ; sys_write
    mov rdi, 1          ; stdout
    mov rsi, char_buf
    mov rdx, 1
    syscall

    inc r13             ; i++
    jmp .loop_chars

.next_line:
    inc r12             ; a++
    jmp .loop_lines

.exit_program:
    ; Сбрасываем цвет в самом конце перед выходом
    mov rax, 1
    mov rdi, 1
    mov rsi, reset_code
    mov rdx, RESET_LEN
    syscall

    ; sys_exit
    mov rax, 60         ; код sys_exit
    xor rdi, rdi        ; status = 0
    syscall

Сохраните код в файл tree.asm.

Скомпилируйте объектный файл: bash nasm -f elf64 tree.asm -o tree.o

Используйте код с осторожностью.Скомпонуйте исполняемый файл: bash ld tree.o -o tree

Используйте код с осторожностью.Запустите:bash ./tree

Всё работает как надо.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 4)

Оценивать ИИшки по Алисе - это сильно…

Спросил дикпика - сделал рабочий код с первой попытки. Подкорректировал вывод и полностью рабочий вариант правильный сделал с третьей.

LightDiver ★★★★★
()
Ответ на: комментарий от peregrine

Спасибо, что похвалили нейронную сеть и косвенно программиста, написавшего руками исходник на C, т.е. меня, который удачно перекладывается на Асм.

Вот вариант, который от gcc, который просто конвертирует код C в Ассембле командой:

gcc -S  tree.c -o ttt.asm

Код:

	.file	"tree.c"
	.text
	.section	.rodata
.LC1:
	.string	"\033[92m%c"
.LC2:
	.string	"\033[0m%c"
	.align 32
.LC0:
	.string	"*#*=*#+:+#@@####*+#@@@%%+#@@%%%%%*+#%%*.\n"
	.zero	257
	.string	"*%##%#+#@@@@**@*%@@%#***%@%%@@#####@@%%\n"
	.zero	258
	.string	"+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n"
	.zero	257
	.string	"+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n"
	.zero	257
	.string	"%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n"
	.zero	257
	.string	"%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n"
	.zero	257
	.string	"*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n"
	.zero	257
	.string	"*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n"
	.zero	257
	.string	"%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%\n*"
	.zero	257
	.string	"%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%*\n"
	.zero	257
	.string	"@@#+*%@@@@@%%**#%##%%%@@@@%##%%#%@%#@%%@\n"
	.zero	257
	.string	"%@%*+##*#@%#%*#@%%%%%@@@*##+*%@@#%%%%##*\n"
	.zero	257
	.string	"#++#+*#@%@%++#%%%%%%%@@%=*%@#%#+#%@@@@%%\n"
	.zero	257
	.string	"*%%##**######%%#@%%%%%#%%##@@##%@@@@%##*\n"
	.zero	257
	.string	"##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n"
	.zero	257
	.string	"##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n"
	.zero	257
	.string	"####*==+%%%#@@#*@@@@@@%%@@%%+*##@@%#@#*#\n"
	.zero	257
	.string	"#%@@%%@@#%%*%@@@+#@@%%%%*#%%%@@#+%%*#%%%\n"
	.zero	257
	.string	"%%%%*#%%%#++#%@%@@@@%%%@%%@%--*@####%##%\n"
	.zero	257
	.string	"**#@@%**@%#+%%%*+#%#%@@@@@@@@@*=#*#%@##@\n"
	.zero	257
	.string	"%+*@@%##%@%+++*%%%%%%%@%*%@@#++%%@%*@@%*\n"
	.zero	257
	.string	"#####%%%@*++++++#####%%#++*@@%%@%*===*%%\n"
	.zero	257
	.string	"##**+#%**+++++=+####%%#======##+%*======\n"
	.zero	257
	.string	"%*+++===++++++===*###%*======*##+##++===\n"
	.zero	257
	.string	"***+++==+++++++==+#%%%#=====++++***+++++\n"
	.zero	257
	.string	"***+++++++++++++=+*##%#+++++++******++++\n"
	.zero	257
	.string	"***+++++++++++++++*%###++++++*******++++\n"
	.zero	257
	.string	"++++++++++++++***%#=%#*****+*********+++\n"
	.zero	257
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	subq	$8400, %rsp
	movq	%fs:40, %rax
	movq	%rax, -8(%rbp)
	xorl	%eax, %eax
	leaq	-8384(%rbp), %rax
	leaq	.LC0(%rip), %rcx
	movl	$8372, %edx
	movq	%rcx, %rsi
	movq	%rax, %rdi
	call	memcpy@PLT
	movl	$0, -8388(%rbp)
	jmp	.L2
.L8:
	movl	$0, -8392(%rbp)
	jmp	.L3
.L7:
	movl	-8392(%rbp), %eax
	movslq	%eax, %rdx
	movl	-8388(%rbp), %eax
	cltq
	imulq	$299, %rax, %rax
	addq	%rbp, %rax
	addq	%rdx, %rax
	subq	$8384, %rax
	movzbl	(%rax), %eax
	cmpb	$64, %al
	jne	.L4
	movl	-8392(%rbp), %eax
	movslq	%eax, %rdx
	movl	-8388(%rbp), %eax
	cltq
	imulq	$299, %rax, %rax
	addq	%rbp, %rax
	addq	%rdx, %rax
	subq	$8384, %rax
	movzbl	(%rax), %eax
	movsbl	%al, %eax
	movl	%eax, %esi
	leaq	.LC1(%rip), %rax
	movq	%rax, %rdi
	movl	$0, %eax
	call	printf@PLT
.L4:
	movl	-8392(%rbp), %eax
	movslq	%eax, %rdx
	movl	-8388(%rbp), %eax
	cltq
	imulq	$299, %rax, %rax
	addq	%rbp, %rax
	addq	%rdx, %rax
	subq	$8384, %rax
	movzbl	(%rax), %eax
	cmpb	$64, %al
	je	.L5
	movl	-8392(%rbp), %eax
	movslq	%eax, %rdx
	movl	-8388(%rbp), %eax
	cltq
	imulq	$299, %rax, %rax
	addq	%rbp, %rax
	addq	%rdx, %rax
	subq	$8384, %rax
	movzbl	(%rax), %eax
	movsbl	%al, %eax
	movl	%eax, %esi
	leaq	.LC2(%rip), %rax
	movq	%rax, %rdi
	movl	$0, %eax
	call	printf@PLT
.L5:
	addl	$1, -8392(%rbp)
.L3:
	cmpl	$298, -8392(%rbp)
	jg	.L6
	movl	-8392(%rbp), %eax
	movslq	%eax, %rdx
	movl	-8388(%rbp), %eax
	cltq
	imulq	$299, %rax, %rax
	addq	%rbp, %rax
	addq	%rdx, %rax
	subq	$8384, %rax
	movzbl	(%rax), %eax
	testb	%al, %al
	jne	.L7
.L6:
	addl	$1, -8388(%rbp)
.L2:
	cmpl	$27, -8388(%rbp)
	jle	.L8
	movl	$0, %eax
	movq	-8(%rbp), %rdx
	subq	%fs:40, %rdx
	je	.L10
	call	__stack_chk_fail@PLT
.L10:
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (Gentoo 11.3.0 p7) 11.3.0"
	.section	.note.GNU-stack,"",@progbits

Можно сравнить работу gcc с работой вашей нейронной сети.

AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 4)
Ответ на: комментарий от madcore

Нейронная сеть определяет почти точно. Изначально я просил Алису сгенерировать дерево в АСКИ. Потом, когда написал код и попросил конвертировать в Асм заодно Алиса выдала, что, похоже, код раскрашивает дерево.

AnonymUser ★
() автор топика
Ответ на: комментарий от AnonymUser

А это не крутая сеть. Это бесплатный чатик в гугле. Крутую надо покупать.

Хотя если его попинать в плане оптимизируй и исправь ошибки, то выходит это:

section .data
    ; Двумерный массив строк char color_str[28][299]
    color_str:
    db "*#*=*#+:+#@@####*+#@@@%%+#@@%%%%%*+#%%*.", 10, 0
    times 299 * 1 - ($ - color_str) db 0
    
    db "*%##%#+#@@@@**@*%@@%#***%@%%@@#####@@%%", 10, 0
    times 299 * 2 - ($ - color_str) db 0
    
    db "+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%", 10, 0
    times 299 * 3 - ($ - color_str) db 0
    
    db "+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%", 10, 0
    times 299 * 4 - ($ - color_str) db 0
    
    db "%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#", 10, 0
    times 299 * 5 - ($ - color_str) db 0
    
    db "%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#", 10, 0
    times 299 * 6 - ($ - color_str) db 0
    
    db "*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#", 10, 0
    times 299 * 7 - ($ - color_str) db 0
    
    db "*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#", 10, 0
    times 299 * 8 - ($ - color_str) db 0
    
    db "%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%", 10, "*", 0
    times 299 * 9 - ($ - color_str) db 0
    
    db "%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%*", 10, 0
    times 299 * 10 - ($ - color_str) db 0
    
    db "@@#+*%@@@@@%%**#%##%%%@@@@%##%%#%@%#@%%@", 10, 0
    times 299 * 11 - ($ - color_str) db 0
    
    db "%@%*+##*#@%#%*#@%%%%%@@@*##+*%@@#%%%%##*", 10, 0
    times 299 * 12 - ($ - color_str) db 0
    
    db "#++#+*#@%@%++#%%%%%%%@@%=*%@#%#+#%@@@@%%", 10, 0
    times 299 * 13 - ($ - color_str) db 0
    
    db "*%%##**######%%#@%%%%%#%%##@@##%@@@@%##*", 10, 0
    times 299 * 14 - ($ - color_str) db 0
    
    db "##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#", 10, 0
    times 299 * 15 - ($ - color_str) db 0
    
    db "##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#", 10, 0
    times 299 * 16 - ($ - color_str) db 0
    
    db "####*==+%%%#@@#*@@@@@@%%@@%%+*##@@%#@#*#", 10, 0
    times 299 * 17 - ($ - color_str) db 0
    
    db "#%@@%%@@#%%*%@@@+#@@%%%%*#%%%@@#+%%*#%%%", 10, 0
    times 299 * 18 - ($ - color_str) db 0
    
    db "%%%%*#%%%#++#%@%@@@@%%%@%%@%--*@####%##%", 10, 0
    times 299 * 19 - ($ - color_str) db 0
    
    db "**#@@%**@%#+%%%*+#%#%@@@@@@@@@*=#*#%@##@", 10, 0
    times 299 * 20 - ($ - color_str) db 0
    
    db "%+*@@%##%@%+++*%%%%%%%@%*%@@#++%%@%*@@%*", 10, 0
    times 299 * 21 - ($ - color_str) db 0
    
    db "#####%%%@*++++++#####%%#++*@@%%@%*===*%%", 10, 0
    times 299 * 22 - ($ - color_str) db 0
    
    db "##**+#%**+++++=+####%%#======##+%*======", 10, 0
    times 299 * 23 - ($ - color_str) db 0
    
    db "%*+++===++++++===*###%*======*##+##++===", 10, 0
    times 299 * 24 - ($ - color_str) db 0
    
    db "***+++==+++++++==+#%%%#=====++++***+++++", 10, 0
    times 299 * 25 - ($ - color_str) db 0
    
    db "***+++++++++++++=+*##%#+++++++******++++", 10, 0
    times 299 * 26 - ($ - color_str) db 0
    
    db "***+++++++++++++++*%###++++++*******++++", 10, 0
    times 299 * 27 - ($ - color_str) db 0
    
    db "++++++++++++++***%#=%#*****+*********+++", 10, 0
    times 299 * 28 - ($ - color_str) db 0

section .bss
    ; Буфер для сборки вывода.
    ; Худший случай: каждый символ оборачивается в ESC-последовательность (примерно 28 * 299 * 6)
    out_buf resb 60000 

section .text
    global _start

_start:
    lea rbx, [color_str] ; rbx = адрес начала текущей строки (замена mul)
    lea rdi, [out_buf]   ; rdi = указатель на текущую позицию в буфере вывода
    xor r12, r12         ; r12 = счетчик строк (0..27)

.loop_lines:
    cmp r12, 28
    jge .flush_and_exit

    xor r13, r13         ; r13 = индекс символа в строке (0..298)

.loop_chars:
    cmp r13, 299
    jge .next_line

    mov dl, [rbx + r13]  ; Загружаем символ напрямую через базу и смещение
    
    cmp dl, 0            ; Встретили '\0'? Идем на следующую строку
    je .next_line

    ; Логика раскраски
    cmp dl, '@'
    je .write_green

.write_reset:
    ; Вместо syscall просто пишем 4 байта управляющего кода в буфер: \033[0m
    mov dword [rdi], 0x6d305b1b  ; 0x1B, '[', '0', 'm' в формате Little Endian
    add rdi, 4
    jmp .write_char

.write_green:
    ; Пишем 5 байт управляющего кода в буфер: \033[92m
    mov dword [rdi], 0x32395b1b  ; 0x1B, '[', '9', '2'
    mov byte [rdi + 4], 0x6d     ; 'm'
    add rdi, 5

.write_char:
    mov [rdi], dl                ; Записываем сам символ дерева
    inc rdi                      ; Двигаем указатель буфера
    
    inc r13                      ; i++
    jmp .loop_chars

.next_line:
    add rbx, 299                 ; Сдвигаем указатель на следующую строку без использования умножения
    inc r12                      ; a++
    jmp .loop_lines

.flush_and_exit:
    ; Добавляем финальный сброс цвета в буфер перед выводом
    mov dword [rdi], 0x6d305b1b
    add rdi, 4

    ; Считаем общую длину получившегося буфера
    lea rsi, [out_buf]
    sub rdi, rsi                 ; rdi теперь хранит размер записанных данных
    mov rdx, rdi                 ; rdx = count для sys_write

    ; ВСЕГО ОДИН СИСВЫЗОВ НА ВСЮ ПРОГРАММУ
    mov rax, 1                   ; sys_write
    mov rdi, 1                   ; stdout
    ; rsi уже указывает на out_buf
    syscall

    ; Завершение работы
    mov rax, 60                  ; sys_exit
    xor rdi, rdi                 ; status = 0
    syscall
peregrine ★★★★★
()
Ответ на: комментарий от AnonymUser

ну сеть делает то, что попросил

я попросил клода дать команду, чтоб сделать самому и он ответил

gcc -S -masm=intel tree.c -o tree.asm
sergej ★★★★★
()

Кратко про персональные компьютеры. Тестирование.

Попробовал запустить GTA 5 на Pentium 4 и Athlon XP. Игру запустить не удалось ни на одном, ни на другом. Но, конечно, сплэш скрин показали оба

MaZy ★★★★★
()
Ответ на: комментарий от AnonymUser

Ещё пнул, стало лучше:

section .data
    ; Сжатые данные дерева: строго парами [счётчик, символ]
    ; Код 0 — маркер конца данных
    compressed_tree:
    db 1, "*", 1, "#", 1, "*", 1, "=", 1, "*", 1, "#", 1, "+", 1, ":", 1, "#", 2, "@", 4, "#", 1, "*", 1, "+", 1, "#", 3, "@", 2, "%", 1, "+", 1, "#", 2, "@", 5, "%", 1, "*", 1, "+", 1, "#", 2, "%", 1, "*", 1, ".", 1, 10
    db 1, "*", 1, "%", 2, "#", 1, "%", 1, "#", 1, "+", 1, "#", 4, "@", 2, "*", 1, "@", 1, "*", 1, "%", 2, "@", 1, "%", 1, "#", 3, "*", 1, "%", 1, "@", 2, "%", 2, "@", 5, "#", 2, "@", 2, "%", 1, 10
    db 1, "+", 1, "#", 3, "%", 1, "#", 1, "%", 1, "@", 2, "%", 1, "@", 1, "%", 1, "@", 3, "%", 1, "#", 1, "*", 1, "#", 2, "@", 4, "%", 3, "#", 4, "%", 1, "+", 1, "*", 2, "#", 4, "%", 1, 10
    db 1, "+", 1, "#", 3, "%", 1, "#", 1, "%", 1, "@", 2, "%", 1, "@", 1, "%", 1, "@", 3, "%", 1, "#", 1, "*", 1, "#", 2, "@", 4, "%", 3, "#", 4, "%", 1, "+", 1, "*", 2, "#", 4, "%", 1, 10
    db 1, "%", 5, "#", 1, "%", 3, "@", 1, "%", 1, "@", 2, "%", 1, "#", 1, "+", 1, "%", 1, "@", 3, "%", 3, "#", 1, "*", 1, "%", 3, "@", 4, "%", 2, "*", 1, "@", 3, "%", 1, "#", 1, 10
    db 1, "%", 5, "#", 1, "%", 3, "@", 1, "%", 1, "@", 2, "%", 1, "#", 1, "+", 1, "%", 1, "@", 3, "%", 3, "#", 1, "*", 1, "%", 3, "@", 4, "%", 2, "*", 1, "@", 3, "%", 1, "#", 1, 10
    db 1, "*", 3, "%", 1, "@", 3, "%", 1, "#", 2, "%", 1, "*", 4, "%", 1, "*", 1, "%", 1, "@", 1, "%", 1, "@", 2, "%", 1, "@", 1, "%", 3, "@", 2, "#", 2, "%", 1, "#", 1, "*", 1, "#", 1, "%", 1, "#", 2, "+", 1, "#", 1, 10
    db 1, "*", 3, "%", 1, "@", 3, "%", 1, "#", 2, "%", 1, "*", 4, "%", 1, "*", 1, "%", 1, "@", 1, "%", 1, "@", 2, "%", 1, "@", 1, "%", 3, "@", 2, "#", 2, "%", 1, "#", 1, "*", 1, "#", 1, "%", 1, "#", 2, "+", 1, "#", 1, 10
    db 1, "%", 2, "=", 2, "%", 1, "@", 1, "%", 1, "#", 1, "%", 3, "@", 1, "%", 1, "*", 1, "=", 1, "*", 1, "@", 3, "%", 1, "@", 2, "#", 2, "@", 1, "%", 1, "#", 1, "*", 1, "@", 3, "%", 1, "@", 2, "#", 3, "@", 1, "%", 1, 10, 1, "*", 1, 10
    db 1, "%", 2, "=", 2, "%", 1, "@", 1, "%", 1, "#", 1, "%", 3, "@", 1, "%", 1, "*", 1, "=", 1, "*", 1, "@", 3, "%", 1, "@", 2, "#", 2, "@", 1, "%", 1, "#", 1, "*", 1, "@", 3, "%", 1, "@", 2, "#", 3, "@", 1, "%", 1, "*", 1, 10
    db 2, "@", 1, "#", 1, "+", 1, "*", 1, "%", 5, "@", 2, "%", 2, "*", 1, "#", 1, "%", 2, "#", 3, "%", 4, "@", 1, "%", 2, "#", 2, "%", 1, "#", 1, "%", 1, "@", 1, "%", 1, "#", 1, "@", 2, "%", 1, "@", 1, 10
    db 1, "%", 1, "@", 1, "%", 1, "*", 1, "+", 2, "#", 1, "*", 1, "#", 1, "@", 1, "%", 1, "#", 1, "%", 1, "*", 1, "#", 1, "@", 5, "%", 3, "@", 1, "*", 2, "#", 1, "+", 1, "*", 1, "%", 2, "@", 1, "#", 4, "%", 2, "#", 1, "*", 1, 10
    db 1, "#", 2, "+", 1, "#", 1, "+", 1, "*", 1, "#", 1, "@", 1, "%", 1, "@", 1, "%", 2, "+", 1, "#", 7, "%", 2, "@", 1, "%", 1, "=", 1, "*", 1, "%", 1, "@", 1, "#", 1, "%", 1, "#", 1, "+", 1, "#", 1, "%", 4, "@", 2, "%", 1, 10
    db 1, "*", 2, "%", 2, "#", 2, "*", 6, "#", 2, "%", 1, "#", 1, "@", 5, "%", 1, "#", 2, "%", 2, "#", 2, "@", 2, "#", 1, "%", 4, "@", 1, "%", 2, "#", 1, "*", 1, 10
    db 2, "#", 1, "%", 3, "@", 1, "%", 1, "+", 4, "%", 1, "#", 1, "%", 3, "@", 2, "%", 2, "@", 3, "%", 1, "#", 1, "%", 2, "@", 1, "#", 1, "%", 7, "@", 2, "%", 1, "#", 1, 10
    db 2, "#", 1, "%", 3, "@", 1, "%", 1, "+", 4, "%", 1, "#", 1, "%", 3, "@", 2, "%", 2, "@", 3, "%", 1, "#", 1, "%", 2, "@", 1, "#", 1, "%", 7, "@", 2, "%", 1, "#", 1, 10
    db 4, "#", 1, "*", 2, "=", 1, "+", 3, "%", 1, "#", 2, "@", 1, "#", 1, "*", 6, "@", 2, "%", 2, "@", 2, "%", 1, "+", 1, "*", 2, "#", 2, "@", 1, "%", 1, "#", 1, "@", 1, "#", 1, "*", 1, "#", 1, 10
    db 1, "#", 1, "%", 2, "@", 2, "%", 2, "@", 2, "%", 1, "#", 2, "%", 1, "*", 1, "%", 3, "@", 1, "+", 2, "@", 4, "%", 1, "*", 1, "#", 3, "%", 2, "@", 1, "#", 1, "+", 2, "%", 1, "*", 1, "#", 3, "%", 1, 10
    db 4, "%", 1, "*", 1, "#", 3, "%", 1, "#", 2, "+", 1, "#", 1, "%", 1, "@", 1, "%", 4, "@", 3, "%", 1, "@", 2, "%", 1, "@", 1, "%", 2, "-", 1, "*", 1, "@", 4, "#", 1, "%", 2, "#", 1, "%", 1, 10
    db 2, "*", 1, "#", 2, "@", 1, "%", 2, "*", 1, "@", 1, "%", 1, "#", 1, "+", 3, "%", 1, "*", 1, "+", 1, "#", 1, "%", 1, "#", 1, "%", 9, "@", 1, "*", 1, "=", 1, "#", 1, "*", 1, "#", 1, "%", 1, "@", 2, "#", 1, "@", 1, 10
    db 1, "%", 1, "+", 1, "*", 2, "@", 1, "%", 2, "#", 1, "%", 1, "@", 1, "%", 3, "+", 1, "*", 7, "%", 1, "@", 1, "%", 1, "*", 1, "%", 2, "@", 1, "#", 2, "+", 2, "%", 1, "@", 1, "%", 1, "*", 2, "@", 1, "%", 1, "*", 1, 10
    db 5, "#", 3, "%", 1, "@", 1, "*", 6, "+", 5, "#", 2, "%", 1, "#", 2, "+", 1, "*", 2, "@", 2, "%", 1, "@", 1, "%", 1, "*", 3, "=", 1, "*", 2, "%", 1, 10
    db 2, "#", 2, "*", 1, "+", 1, "#", 1, "%", 2, "*", 5, "+", 1, "=", 1, "+", 4, "#", 2, "%", 1, "#", 6, "=", 2, "#", 1, "+", 1, "%", 1, "*", 6, "=", 1, 10
    db 1, "%", 1, "*", 3, "+", 3, "=", 6, "+", 3, "=", 1, "*", 3, "#", 1, "%", 1, "*", 6, "=", 1, "*", 2, "#", 1, "+", 2, "#", 2, "+", 3, "=", 1, 10
    db 3, "*", 3, "+", 2, "=", 7, "+", 2, "=", 1, "+", 3, "#", 1, "%", 1, "#", 5, "=", 4, "+", 3, "*", 5, "+", 1, 10
    db 3, "*", 13, "+", 1, "=", 1, "+", 1, "*", 2, "#", 1, "%", 1, "#", 7, "+", 6, "*", 4, "+", 1, 10
    db 3, "*", 15, "+", 1, "*", 1, "%", 3, "#", 6, "+", 7, "*", 4, "+", 1, 10
    db 14, "+", 3, "*", 1, "%", 1, "#", 1, "=", 1, "#", 5, "*", 1, "+", 9, "*", 3, "+", 1, 10
    db 0 ; Конец массива

section .bss
    ; Буфер под вывод (15-20 КБ гарантированно хватит)
    out_buf resb 30000 

section .text
    global _start

_start:
    lea rsi, [compressed_tree]
    lea rdi, [out_buf]

.unpack_loop:
    movzx rax, byte [rsi]       ; Получаем количество повторений
    cmp rax, 0                  ; Конец всех данных?
    je .flush_and_exit
    
    mov dl, [rsi + 1]           ; Получаем сам символ
    add rsi, 2                  ; Переходим к следующей паре данных

    ; Если встретили перевод строки (\n), то управляющие коды не нужны
    cmp dl, 10
    je .write_chars

    ; --- Проверка цвета ---
    cmp dl, '@'
    je .set_green

.set_reset:
    mov dword [rdi], 0x6d305b1b ; Код сброса \033[0m
    add rdi, 4
    jmp .write_chars

.set_green:
    mov dword [rdi], 0x32395b1b ; Часть кода \033[92
    mov byte [rdi + 4], 0x6d    ; Буква m
    add rdi, 5

.write_chars:
    ; Записываем символ dl в буфер rax раз
    mov [rdi], dl
    inc rdi
    dec rax
    jnz .write_chars
    jmp .unpack_loop

.flush_and_exit:
    ; Добавляем финальный сброс цвета
    mov dword [rdi], 0x6d305b1b
    add rdi, 4

    ; Считаем длину получившегося буфера
    lea rsi, [out_buf]
    sub rdi, rsi                ; rdi = длина
    mov rdx, rdi                ; rdx = count

    ; Вывод буфера на экран
    mov rax, 1                  ; sys_write
    mov rdi, 1                  ; stdout
    syscall

    ; Корректный выход
    mov rax, 60                 ; sys_exit
    xor rdi, rdi
    syscall

Понятно что и тут можно улучшить, и в отличии от gcc есть комментарии к коду

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от AnonymUser

Спасибо, что похвалили нейронную сеть и косвенно программиста, написавшего, руками исходник на C, т.е. меня,

нет, кроме того, что твоя программа с ошибками, её всю целиком можно свести к одному printf

который удачно перекладывается на Асм.

и даже в этом - нет

madcore ★★★★★
()
Ответ на: комментарий от LightDiver

Спросил дикпика - сделал рабочий код с первой попытки. Подкорректировал вывод и полностью рабочий вариант правильный сделал с третьей.

Мне с 1-й попытки сделал, но это была задача из учебника.

question4 ★★★★★
()
Ответ на: комментарий от AnonymUser

Ну не досмотрел чуток. И это, тебе бы gcc с оптимизациями собрать, а то сравниваем шляпу.

Пришлось по строкам пинать, иначе забывает. Вышло:

section .data
    ; Полностью выверенные данные дерева с учетом встроенного переноса строки
    compressed_tree:
    db 1, "*", 1, "#", 1, "*", 1, "=", 1, "*", 1, "#", 1, "+", 1, ":", 1, "+", 1, "#", 2, "@", 4, "#", 1, "*", 1, "+", 1, "#", 3, "@", 2, "%", 1, "+", 1, "#", 2, "@", 5, "%", 1, "*", 1, "+", 1, "#", 2, "%", 1, "*", 1, ".", 1, 10
    db 1, "*", 1, "%", 2, "#", 1, "%", 1, "#", 1, "+", 1, "#", 4, "@", 2, "*", 1, "@", 1, "*", 1, "%", 2, "@", 1, "%", 1, "#", 3, "*", 1, "%", 1, "@", 2, "%", 2, "@", 5, "#", 2, "@", 2, "%", 1, 10
    db 1, "+", 1, "#", 3, "%", 1, "#", 1, "%", 1, "@", 1, "%", 2, "@", 1, "%", 1, "@", 3, "%", 1, "#", 1, "*", 1, "#", 2, "@", 4, "%", 3, "#", 4, "%", 1, "+", 1, "*", 2, "#", 4, "%", 1, 10
    db 1, "+", 1, "#", 3, "%", 1, "#", 1, "%", 1, "@", 1, "%", 2, "@", 1, "%", 1, "@", 3, "%", 1, "#", 1, "*", 1, "#", 2, "@", 4, "%", 3, "#", 4, "%", 1, "+", 1, "*", 2, "#", 4, "%", 1, 10
    db 1, "%", 5, "#", 1, "%", 3, "@", 1, "%", 1, "@", 2, "%", 1, "#", 1, "+", 1, "%", 1, "@", 3, "%", 3, "#", 1, "*", 1, "%", 3, "@", 4, "%", 2, "*", 1, "@", 3, "%", 1, "#", 1, 10
    db 1, "%", 5, "#", 1, "%", 3, "@", 1, "%", 1, "@", 2, "%", 1, "#", 1, "+", 1, "%", 1, "@", 3, "%", 3, "#", 1, "*", 1, "%", 3, "@", 4, "%", 2, "*", 1, "@", 3, "%", 1, "#", 1, 10
    db 1, "*", 3, "%", 1, "@", 3, "%", 1, "#", 2, "%", 1, "*", 4, "%", 1, "*", 1, "%", 1, "@", 1, "%", 1, "@", 2, "%", 1, "@", 1, "%", 3, "@", 2, "#", 2, "%", 1, "#", 1, "*", 1, "#", 1, "%", 1, "#", 2, "+", 1, "#", 1, 10
    db 1, "*", 3, "%", 1, "@", 3, "%", 1, "#", 2, "%", 1, "*", 4, "%", 1, "*", 1, "%", 1, "@", 1, "%", 1, "@", 2, "%", 1, "@", 1, "%", 3, "@", 2, "#", 2, "%", 1, "#", 1, "*", 1, "#", 1, "%", 1, "#", 2, "+", 1, "#", 1, 10
    ; ОБЪЕДИНЕННЫЕ СТРОКИ 9 И 10 С КОРРЕКТНЫМ ПЕРЕНОСОМ И ЗВЕЗДОЧКАМИ:
    db 1, "%", 2, "=", 2, "%", 1, "@", 1, "%", 1, "#", 1, "%", 3, "@", 1, "%", 1, "*", 1, "=", 1, "*", 1, "@", 3, "%", 1, "@", 2, "#", 2, "@", 1, "%", 1, "#", 1, "*", 1, "@", 3, "%", 1, "@", 2, "#", 3, "@", 1, "%", 1, 10, 1, "*", 1, "%", 2, "=", 2, "%", 1, "@", 1, "%", 1, "#", 1, "%", 3, "@", 1, "%", 1, "*", 1, "=", 1, "*", 1, "@", 3, "%", 1, "@", 2, "#", 2, "@", 1, "%", 1, "#", 1, "*", 1, "@", 3, "%", 1, "@", 2, "#", 3, "@", 1, "%", 1, "*", 1, 10
    db 2, "@", 1, "#", 1, "+", 1, "*", 1, "%", 5, "@", 2, "%", 2, "*", 1, "#", 1, "%", 2, "#", 3, "%", 4, "@", 1, "%", 2, "#", 2, "%", 1, "#", 1, "%", 1, "@", 1, "%", 1, "#", 1, "@", 2, "%", 1, "@", 1, 10
    db 1, "%", 1, "@", 1, "%", 1, "*", 1, "+", 2, "#", 1, "*", 1, "#", 1, "@", 1, "%", 1, "#", 1, "%", 1, "*", 1, "#", 1, "@", 5, "%", 3, "@", 1, "*", 2, "#", 1, "+", 1, "*", 1, "%", 2, "@", 1, "#", 4, "%", 2, "#", 1, "*", 1, 10
    db 1, "#", 2, "+", 1, "#", 1, "+", 1, "*", 1, "#", 1, "@", 1, "%", 1, "@", 1, "%", 2, "+", 1, "#", 7, "%", 2, "@", 1, "%", 1, "=", 1, "*", 1, "%", 1, "@", 1, "#", 1, "%", 1, "#", 1, "+", 1, "#", 1, "%", 4, "@", 2, "%", 1, 10
    db 1, "*", 2, "%", 2, "#", 2, "*", 6, "#", 2, "%", 1, "#", 1, "@", 5, "%", 1, "#", 2, "%", 2, "#", 2, "@", 2, "#", 1, "%", 4, "@", 1, "%", 2, "#", 1, "*", 1, 10
    db 2, "#", 1, "%", 3, "@", 1, "%", 1, "+", 4, "%", 1, "#", 1, "%", 3, "@", 2, "%", 2, "@", 3, "%", 1, "#", 1, "%", 2, "@", 1, "#", 1, "%", 7, "@", 2, "%", 1, "#", 1, 10
    db 2, "#", 1, "%", 3, "@", 1, "%", 1, "+", 4, "%", 1, "#", 1, "%", 3, "@", 2, "%", 2, "@", 3, "%", 1, "#", 1, "%", 2, "@", 1, "#", 1, "%", 7, "@", 2, "%", 1, "#", 1, 10
    db 4, "#", 1, "*", 2, "=", 1, "+", 3, "%", 1, "#", 2, "@", 1, "#", 1, "*", 6, "@", 2, "%", 2, "@", 2, "%", 1, "+", 1, "*", 2, "#", 2, "@", 1, "%", 1, "#", 1, "@", 1, "#", 1, "*", 1, "#", 1, 10
    db 1, "#", 1, "%", 2, "@", 2, "%", 2, "@", 1, "#", 2, "%", 1, "*", 1, "%", 3, "@", 1, "+", 1, "#", 2, "@", 4, "%", 1, "*", 1, "#", 3, "%", 2, "@", 1, "#", 1, "+", 2, "%", 1, "*", 1, "#", 3, "%", 1, 10
    db 4, "%", 1, "*", 1, "#", 3, "%", 1, "#", 2, "+", 1, "#", 1, "%", 1, "@", 1, "%", 4, "@", 3, "%", 1, "@", 2, "%", 1, "@", 1, "%", 2, "-", 1, "*", 1, "@", 4, "#", 1, "%", 2, "#", 1, "%", 1, 10
    db 2, "*", 1, "#", 2, "@", 1, "%", 2, "*", 1, "@", 1, "%", 1, "#", 1, "+", 3, "%", 1, "*", 1, "+", 1, "#", 1, "%", 1, "#", 1, "%", 9, "@", 1, "*", 1, "=", 1, "#", 1, "*", 1, "#", 1, "%", 1, "@", 2, "#", 1, "@", 1, 10
    db 1, "%", 1, "+", 1, "*", 2, "@", 1, "%", 2, "#", 1, "%", 1, "@", 1, "%", 3, "+", 1, "*", 7, "%", 1, "@", 1, "%", 1, "*", 1, "%", 2, "@", 1, "#", 2, "+", 2, "%", 1, "@", 1, "%", 1, "*", 2, "@", 1, "%", 1, "*", 1, 10
    db 5, "#", 3, "%", 1, "@", 1, "*", 6, "+", 5, "#", 2, "%", 1, "#", 2, "+", 1, "*", 2, "@", 2, "%", 1, "@", 1, "%", 1, "*", 3, "=", 1, "*", 2, "%", 1, 10
    db 2, "#", 2, "*", 1, "+", 1, "#", 1, "%", 2, "*", 5, "+", 1, "=", 1, "+", 4, "#", 2, "%", 1, "#", 6, "=", 2, "#", 1, "+", 1, "%", 1, "*", 6, "=", 1, 10
    db 1, "%", 1, "*", 3, "+", 3, "=", 6, "+", 3, "=", 1, "*", 3, "#", 1, "%", 1, "*", 6, "=", 1, "*", 2, "#", 1, "+", 2, "#", 2, "+", 3, "=", 1, 10
    db 3, "*", 3, "+", 2, "=", 7, "+", 2, "=", 1, "+", 1, "#", 3, "%", 1, "#", 5, "=", 4, "+", 3, "*", 5, "+", 1, 10
    db 3, "*", 13, "+", 1, "=", 1, "+", 1, "*", 2, "#", 1, "%", 1, "#", 7, "+", 6, "*", 4, "+", 1, 10
    db 3, "*", 15, "+", 1, "*", 1, "%", 3, "#", 6, "+", 7, "*", 4, "+", 1, 10
    db 14, "+", 3, "*", 1, "%", 1, "#", 1, "=", 1, "%", 1, "#", 5, "*", 1, "+", 9, "*", 3, "+", 1, 10
    db 0
    section .bss
    out_buf resb 40000 

section .text
    global _start

_start:
    lea rsi, [compressed_tree]
    lea rdi, [out_buf]
    xor r8, r8                  ; r8 = текущее состояние цвета (0 - обычный, 1 - зеленый)

.unpack_loop:
    movzx rax, byte [rsi]       ; rax = количество повторений
    cmp rax, 0
    je .flush_and_exit
    
    mov dl, [rsi + 1]           ; dl = символ
    add rsi, 2

    cmp dl, 10                  ; Перевод строки красить не нужно
    je .write_chars

    ; --- Логика переключения цвета ---
    cmp dl, '@'
    je .check_green

.check_reset:
    cmp r8, 0                   ; Если уже сброшен, сразу пишем символы
    je .write_chars
    mov dword [rdi], 0x6d305b1b ; Иначе пишем \033[0m
    add rdi, 4
    xor r8, r8                  ; Переключаем статус на обычный
    jmp .write_chars

.check_green:
    cmp r8, 1                   ; Если уже зеленый, сразу пишем символы
    je .write_chars
    mov dword [rdi], 0x32395b1b ; Иначе пишем \033[92
    mov byte [rdi + 4], 0x6d    ; Буква m
    add rdi, 5
    mov r8, 1                   ; Переключаем статус на зеленый

.write_chars:
    mov [rdi], dl
    inc rdi
    dec rax
    jnz .write_chars
    jmp .unpack_loop

.flush_and_exit:
    ; Финальный сброс цвета
    cmp r8, 0
    je .send_to_screen
    mov dword [rdi], 0x6d305b1b
    add rdi, 4

.send_to_screen:
    lea rsi, [out_buf]
    sub rdi, rsi                ; rdi = точная длина буфера
    mov rdx, rdi

    mov rax, 1                  ; sys_write
    mov rdi, 1                  ; stdout
    syscall

    ; Выход
    mov rax, 60                 ; sys_exit
    xor rdi, rdi
    syscall
peregrine ★★★★★
()
Ответ на: комментарий от AnonymUser

Нет. Код должен раскрашивать листья.

ну ок
зачем тебе там вообще двумерный массив?
достаточно было бы одного цикла без вложений
ну раз уж зачем-то нужен, что за магическое 299?
это дико некруто для размещения данных и неудобно для расчётов, раз уж ты сослался на «удачно перекладывается на асм»
в твоём случае оптимально было бы 256 - в итоге просто инкремент старшей части для перехода на следующую строку

далее - крайне неоптимально
цвет надо выдавать только перед листом и после
также, не дёргать на каждый символ вызов printf, да ещё и с парсингом шаблона

Какие там ошибки?!

во второй строке неправильное кол-во символов

madcore ★★★★★
()
Ответ на: комментарий от peregrine

Код от компилятора Clang просто не влез в сообщение, интересующиеся могут посмотреть на него собрав оригинальную программу так: clang -S -O3 -mllvm --x86-asm-syntax=intel treec.c -o treecclang.asm, от gcc

	.file	"treec.c"
	.text
	.section	.rodata.str1.1,"aMS",@progbits,1
.LC1:
	.string	"\033[0m%c"
.LC2:
	.string	"\033[92m%c"
	.section	.rodata
	.align 32
.LC0:
	.string	"*#*=*#+:+#@@####*+#@@@%%+#@@%%%%%*+#%%*.\n"
	.zero	257
	.string	"*%##%#+#@@@@**@*%@@%#***%@%%@@#####@@%%\n"
	.zero	258
	.string	"+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n"
	.zero	257
	.string	"+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n"
	.zero	257
	.string	"%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n"
	.zero	257
	.string	"%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n"
	.zero	257
	.string	"*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n"
	.zero	257
	.string	"*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n"
	.zero	257
	.string	"%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%\n*"
	.zero	257
	.string	"%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%*\n"
	.zero	257
	.string	"@@#+*%@@@@@%%**#%##%%%@@@@%##%%#%@%#@%%@\n"
	.zero	257
	.string	"%@%*+##*#@%#%*#@%%%%%@@@*##+*%@@#%%%%##*\n"
	.zero	257
	.string	"#++#+*#@%@%++#%%%%%%%@@%=*%@#%#+#%@@@@%%\n"
	.zero	257
	.string	"*%%##**######%%#@%%%%%#%%##@@##%@@@@%##*\n"
	.zero	257
	.string	"##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n"
	.zero	257
	.string	"##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n"
	.zero	257
	.string	"####*==+%%%#@@#*@@@@@@%%@@%%+*##@@%#@#*#\n"
	.zero	257
	.string	"#%@@%%@@#%%*%@@@+#@@%%%%*#%%%@@#+%%*#%%%\n"
	.zero	257
	.string	"%%%%*#%%%#++#%@%@@@@%%%@%%@%--*@####%##%\n"
	.zero	257
	.string	"**#@@%**@%#+%%%*+#%#%@@@@@@@@@*=#*#%@##@\n"
	.zero	257
	.string	"%+*@@%##%@%+++*%%%%%%%@%*%@@#++%%@%*@@%*\n"
	.zero	257
	.string	"#####%%%@*++++++#####%%#++*@@%%@%*===*%%\n"
	.zero	257
	.string	"##**+#%**+++++=+####%%#======##+%*======\n"
	.zero	257
	.string	"%*+++===++++++===*###%*======*##+##++===\n"
	.zero	257
	.string	"***+++==+++++++==+#%%%#=====++++***+++++\n"
	.zero	257
	.string	"***+++++++++++++=+*##%#+++++++******++++\n"
	.zero	257
	.string	"***+++++++++++++++*%###++++++*******++++\n"
	.zero	257
	.string	"++++++++++++++***%#=%#*****+*********+++\n"
	.zero	257
	.section	.text.startup,"ax",@progbits
	.p2align 4
	.globl	main
	.type	main, @function
main:
.LFB23:
	.cfi_startproc
	endbr64
	pushq	%r14
	.cfi_def_cfa_offset 16
	.cfi_offset 14, -16
	pushq	%r13
	.cfi_def_cfa_offset 24
	.cfi_offset 13, -24
	pushq	%r12
	.cfi_def_cfa_offset 32
	.cfi_offset 12, -32
	pushq	%rbp
	.cfi_def_cfa_offset 40
	.cfi_offset 6, -40
	pushq	%rbx
	.cfi_def_cfa_offset 48
	.cfi_offset 3, -48
	subq	$4096, %rsp
	.cfi_def_cfa_offset 4144
	orq	$0, (%rsp)
	subq	$4096, %rsp
	.cfi_def_cfa_offset 8240
	orq	$0, (%rsp)
	subq	$192, %rsp
	.cfi_def_cfa_offset 8432
	movl	$8372, %edx
	leaq	.LC0(%rip), %rsi
	leaq	.LC2(%rip), %r12
	leaq	.LC1(%rip), %rbp
	movq	%fs:40, %rax
	movq	%rax, 8376(%rsp)
	xorl	%eax, %eax
	movq	%rsp, %rdi
	leaq	299(%rsp), %rbx
	leaq	8671(%rsp), %r13
	call	memcpy@PLT
	.p2align 4,,10
	.p2align 3
.L2:
	leaq	-299(%rbx), %r14
	jmp	.L5
	.p2align 4,,10
	.p2align 3
.L15:
	movq	%rbp, %rsi
	movl	$2, %edi
	xorl	%eax, %eax
	addq	$1, %r14
	call	__printf_chk@PLT
	cmpq	%rbx, %r14
	je	.L8
.L5:
	movsbl	(%r14), %edx
	testb	%dl, %dl
	je	.L8
	cmpb	$64, %dl
	jne	.L15
	movl	$64, %edx
	movq	%r12, %rsi
	movl	$2, %edi
	xorl	%eax, %eax
	call	__printf_chk@PLT
	addq	$1, %r14
	cmpq	%rbx, %r14
	jne	.L5
	.p2align 4,,10
	.p2align 3
.L8:
	addq	$299, %rbx
	cmpq	%r13, %rbx
	jne	.L2
	movq	8376(%rsp), %rax
	subq	%fs:40, %rax
	jne	.L16
	addq	$8384, %rsp
	.cfi_remember_state
	.cfi_def_cfa_offset 48
	xorl	%eax, %eax
	popq	%rbx
	.cfi_def_cfa_offset 40
	popq	%rbp
	.cfi_def_cfa_offset 32
	popq	%r12
	.cfi_def_cfa_offset 24
	popq	%r13
	.cfi_def_cfa_offset 16
	popq	%r14
	.cfi_def_cfa_offset 8
	ret
.L16:
	.cfi_restore_state
	call	__stack_chk_fail@PLT
	.cfi_endproc
.LFE23:
	.size	main, .-main
	.ident	"GCC: (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0"
	.section	.note.GNU-stack,"",@progbits
	.section	.note.gnu.property,"a"
	.align 8
	.long	1f - 0f
	.long	4f - 1f
	.long	5
0:
	.string	"GNU"
1:
	.align 8
	.long	0xc0000002
	.long	3f - 2f
2:
	.long	0x3
3:
	.align 8
4:
peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от madcore

Сообщение Кратко про нейронные сети. Тестирование (комментарий) содержит ИИ-шницу в которой всё вроде как исправлено. По крайней мере расстояние левенштейна между выводом этой программы и того что у ТС-а в стартовом посте 0

peregrine ★★★★★
()
Ответ на: комментарий от madcore

Ну ок. Одного цикла достаточно. Согласен. Переборщил. С массивом мне удобно было визуализировать само дерево. Если одной строкой делать, то она слишком длинная получается.

#include <stdio.h>
int main (void) {
int i;
/*Дерево*/
char  color_str[1220] = "*#*=*#+:+#@@####*+#@@@%%+#@@%%%%%*+#%%*.\n*%##%#+#@@@@**@*%@@%#***%@%%@@#####@@%%\n+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%\n*%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%*\n@@#+*%@@@@@%%**#%##%%%@@@@%##%%#%@%#@%%@\n%@%*+##*#@%#%*#@%%%%%@@@*##+*%@@#%%%%##*\n#++#+*#@%@%++#%%%%%%%@@%=*%@#%#+#%@@@@%%\n*%%##**######%%#@%%%%%#%%##@@##%@@@@%##*\n##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n####*==+%%%#@@#*@@@@@@%%@@%%+*##@@%#@#*#\n#%@@%%@@#%%*%@@@+#@@%%%%*#%%%@@#+%%*#%%%\n%%%%*#%%%#++#%@%@@@@%%%@%%@%--*@####%##%\n**#@@%**@%#+%%%*+#%#%@@@@@@@@@*=#*#%@##@\n%+*@@%##%@%+++*%%%%%%%@%*%@@#++%%@%*@@%*\n#####%%%@*++++++#####%%#++*@@%%@%*===*%%\n##**+#%**+++++=+####%%#======##+%*======\n%*+++===++++++===*###%*======*##+##++===\n***+++==+++++++==+#%%%#=====++++***+++++\n***+++++++++++++=+*##%#+++++++******++++\n***+++++++++++++++*%###++++++*******++++\n++++++++++++++***%#=%#*****+*********+++\n\0";

i=0;
while(color_str[i] != '\0' ) {

	/*Красим листья*/
	if(color_str[i] == '@')
	printf("\033[92m%c", color_str[i]);
	/*Сбрасываем цвет*/
	else
	printf("\033[0m%c", color_str[i]);
	i++;
	}
	return 0;
}

AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 2)
Ответ на: комментарий от AnonymUser

Ну эскейп последовательности таки можно в printf. Скомпилировал твою программу, сделал (лапшу писал не я а ИИ, мне лень):

 ./a.out | sed 's/'$(printf '\033')'/\\033/g; s/"/\\"/g; s/%/%%/g' | awk '{printf "%s\\n", $0}' | sed 's/^/printf("/; s/$/");\n/' > output.txt

Дальше внёс в файл:

#include <stdio.h>

int main() {
// тут содержимое из output.txt
}

А теперь самое интересное: а что по ассемблеру? gcc -S -O3 -fverbose-asm brain.c -o brain.s

	.file	"brain.c"
# GNU C17 (Ubuntu 13.3.0-6ubuntu2~24.04.1) version 13.3.0 (x86_64-linux-gnu)
#	compiled by GNU C version 13.3.0, GMP version 6.3.0, MPFR version 4.2.1, MPC version 1.3.1, isl version isl-0.26-GMP

# GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
# options passed: -mtune=generic -march=x86-64 -O3 -fasynchronous-unwind-tables -fstack-protector-strong -fstack-clash-protection -fcf-protection
	.text
	.section	.rodata.str1.8,"aMS",@progbits,1
	.align 8
.LC0:
	.ascii	"\033[0m*\033[0m#\033[0m*\033[0m=\033[0m*\033[0m#\033[0m+\033"
	# кучу строк с данными выкинул, лимит сообщения
	.ascii	"\033"
	.string	"[0m*\033[0m*\033[0m*\033[0m*\033[0m*\033[0m+\033[0m+\033[0m+\033[0m+\033[0m\n\033[0m+\033[0m+\033[0m+\033[0m+\033[0m+\033[0m+\033[0m+\033[0m+\033[0m+\033[0m+\033[0m+\033[0m+\033[0m+\033[0m+\033[0m*\033[0m*\033[0m*\033[0m%%\033[0m#\033[0m=\033[0m%%\033[0m#\033[0m*\033[0m*\033[0m*\033[0m*\033[0m*\033[0m+\033[0m*\033[0m*\033[0m*\033[0m*\033[0m*\033[0m*\033[0m*\033[0m*\033[0m*\033[0m+\033[0m+\033[0m+\033[0m\n"
	.section	.text.startup,"ax",@progbits
	.p2align 4
	.globl	main
	.type	main, @function
main:
.LFB23:
	.cfi_startproc
	endbr64	
	subq	$8, %rsp	#,
	.cfi_def_cfa_offset 16
# /usr/include/x86_64-linux-gnu/bits/stdio2.h:86:   return __printf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack ());
	leaq	.LC0(%rip), %rsi	#, tmp83
	movl	$2, %edi	#,
	xorl	%eax, %eax	#
	call	__printf_chk@PLT	#
# brain.c:5: }
	xorl	%eax, %eax	#
	addq	$8, %rsp	#,
	.cfi_def_cfa_offset 8
	ret	
	.cfi_endproc
.LFE23:
	.size	main, .-main
	.ident	"GCC: (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0"
	.section	.note.GNU-stack,"",@progbits
	.section	.note.gnu.property,"a"
	.align 8
	.long	1f - 0f
	.long	4f - 1f
	.long	5
0:
	.string	"GNU"
1:
	.align 8
	.long	0xc0000002
	.long	3f - 2f
2:
	.long	0x3
3:
	.align 8
4:

Вывод: ИИ делает ровно то что от него просят. Серьёзная оптимизация требует либо своей головы, либо правильно заданных вопросов.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от AnonymUser

ну ты приколист
ц умеет склеивать строки
и размер[] для строковых констант выдумывать не нужно

 
char * color_str =
    "*#*=*#+:+#@@####*+#@@@%%+#@@%%%%%*+#%%*.\n"
    "*%##%#+#@@@@**@*%@@%#***%@%%@@#####@@%%\n"
    "+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n"
// итд


printf(«\033[92m%c», color_str);

вывод с шаблоном тут не нужен
тебе нужно вывести один из esc, а потом символ, раз уж не хочешь морочиться с нормальной оптимизированной буферизацией выхлопа

madcore ★★★★★
()
Ответ на: комментарий от peregrine

А это не крутая сеть. Это бесплатный чатик в гугле. Крутую надо покупать.

у алисы кстати тоже 2 версии, бесплатная и про, которая идет с подпиской 360.

Вывод про:

Переписать этот код на NASM — сложная задача: ассемблер сильно отличается от C, требует ручной работы с памятью и системными вызовами. Кратко — основные шаги:

Разместить строки (color_str) в секции .data.
Организовать два вложенных цикла (по a и i).
Для каждого символа проверять, равен ли он '@'.
Выводить символы через системный вызов write (Linux) или int 0x21 (DOS), а не printf.
Вставлять ANSI‑коды цвета (\033[92m, \033[0m) перед выводом соответствующих символов.
Пример фрагмента (NASM, Linux x86‑64):


section .data
    color_str db "*#*=*#+:+#@@####*+#@@@%%+#@@%%%%%*+#%%*.", 10, ... ; все строки подряд
    ; ...
    green db 27, '[92m'
    reset db 27, '[0m'

section .text
    global _start

_start:
    mov rsi, color_str    ; указатель на данные
    mov ecx, 28          ; внешний цикл: 28 строк
outer_loop:
    push rcx
    mov edx, 299       ; максимум 299 символов на строку
inner_loop:
    lodsb                ; читаем байт в AL
    cmp al, 0
    je next_line         ; конец строки — на следующую
    cmp al, '@'
    jne print_normal
    ; вывод кода зелёного цвета
    mov rax, 1
    mov rdi, 1
    mov rsi, green
    mov rdx, 4
    syscall
print_normal:
    ; вывод текущего символа
    mov [char_buf], al
    mov rax, 1
    mov rdi, 1
    mov rsi, char_buf
    mov rdx, 1
    syscall
    dec edx
    jnz inner_loop
next_line:
    pop rcx
    loop outer_loop
    ; выход
    mov rax, 60
    xor rdi, rdi
    syscall

section .bss
    char_buf resb 1

Важные замечания:

Полный код будет значительно длиннее C‑версии.

Нужно вручную рассчитать и разместить все строки в .data.

ANSI‑цвета работают только в терминалах, поддерживающих их.

Код выше — упрощённый скелет; для полной функциональности потребуется доработка (например, обработка переноса строк).

Хотите, я раскрою какой‑то блок подробнее или помогу с конкретным участком?

(дальнейшие запросы я не стал задавать)

Lrrr ★★★★★
()
Ответ на: комментарий от AnonymUser

короч, в простейшем виде кот твоей программы будет такой, его и скармливай своим нейронкам:

    int i = 0;
    char ch;
    while(ch = color_str[i++]) {
        if(ch == '@') fputs("\033[92m@\033[0m", stdout);
        else putchar(ch);
    }


gcc делает так:

        .file   "lold.c"
        .text
        .section        .rodata.str1.8,"aMS",@progbits,1
        .align 8
.LC0:
        .ascii  "*#*=*#+:+#@@####*+#@@@%%+#@@%%%%%*+#%%*.\n*%##%#+#@@@@**@*%@"
        .ascii  "@%#***%@%%@@#####@@%%\n+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%"
        .ascii  "%%%\n+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n%#####%@@@%@%"
        .ascii  "%#+%@%%%###*%@@@%%%%**@%%%#\n%#####%@@@%@%%#+%@%%%###*%@@@%%"
        .ascii  "%%**@%%%#\n*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n*%%%@%%"
        .ascii  "%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n%==%%@%#%@@@%*=*@%%%@##@@"
        .ascii  "%#*@%%%@##@@@%\n*%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%*\n@"
        .ascii  "@#+*%@@@@@%%**#%##%%%@@@@%##%%#%@%#@%%@\n%@%*+##*#@%#%*#@%%%"
        .ascii  "%%@@@*##+*%@@#%%%%##*\n#++#+*#@%@%++#%%%%%%%@@%=*%@#%#+#%@@@"
        .ascii  "@%%\n*%%##**######%%#@%%%%%#%%##@@##%@@@@%##*\n##%@@@%+%%%%#"
        .ascii  "%@@@%%@@%%%#%@@#%@@@@@@@%%#\n##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@"
        .ascii  "@@@@@@%%#\n####*==+%%%#@@#*@@@@@@%%@@%%+*##@@%#@#*#\n#%@@%%@"
        .ascii  "@#%%*%@@@+#@@%%%%*#%%%@@#+%%*#%%%\n%%%%*#%%%#++#%@%@@@@%%%@%"
        .ascii  "%@%--*@####%##%\n**#@@%**@%#+%%%*+#%#%@@@@@@@@@*=#*#%@##@\n%"
        .ascii  "+*@@%##%@%+++*%%%%%%%@%*%@@#++%%@%*@@%*\n#####%%%@*++++++###"
        .ascii  "##%%#++*@@%%"
        .string "@%*===*%%\n##**+#%**+++++=+####%%#======##+%*======\n%*+++===++++++===*###%*======*##+##++===\n***+++==+++++++==+#%%%#=====++++***+++++\n***+++++++++++++=+*##%#+++++++******++++\n***+++++++++++++++*%###++++++*******++++\n++++++++++++++***%#=%#*****+*********+++\n"
        .section        .rodata.str1.1,"aMS",@progbits,1
.LC1:
        .string "\033[92m@\033[0m"
        .section        .text.startup,"ax",@progbits
        .p2align 4
        .globl  main
        .type   main, @function
main:
.LFB23:
        .cfi_startproc
        pushq   %rbx
        .cfi_def_cfa_offset 16
        .cfi_offset 3, -16
        leaq    .LC0(%rip), %rbx
        movl    $42, %edi
        jmp     .L4
        .p2align 4,,10
        .p2align 3
.L2:
        call    putc@PLT
        movsbl  1(%rbx), %edi
        addq    $1, %rbx
        testb   %dil, %dil
        je      .L8
.L4:
        cmpb    $64, %dil
        movq    stdout(%rip), %rsi
        jne     .L2
        movq    %rsi, %rcx
        addq    $1, %rbx
        movl    $10, %edx
        leaq    .LC1(%rip), %rdi
        movl    $1, %esi
        call    fwrite@PLT
        movsbl  (%rbx), %edi
        testb   %dil, %dil
        jne     .L4
.L8:
        xorl    %eax, %eax
        popq    %rbx
        .cfi_def_cfa_offset 8
        ret
        .cfi_endproc
.LFE23:
        .size   main, .-main
        .ident  "GCC: (Gentoo 15.2.1_p20260214 p5) 15.2.1 20260214"
        .section        .note.GNU-stack,"",@progbits


но это крайне неоптимально с точки зрения дёрганья системных вызовов на каждый символ
правильней развернуть цикл с выводом подстрок листьев/обычных символов, спроси у ней об этом

madcore ★★★★★
()
Ответ на: комментарий от madcore

Скинь весь код сишный, я смотрю при помощи perf stat что там по cycles и пока нейронка и ассемблер выигрывает даже у gcc с выводом большой константы. Для последней нейронной версии кода имеем: 253 631 cycles, а для кода с print и большой константой имеем: 1 742 940 cycles что ну прям разного порядка величины. Если упороться и сделать всё константой с уже размеченным перекрашиванием через write (который в #include <unistd.h>) вместо print-а, то получим: 1 312 774 cycles т.е. всё равно рядом даже не стояло. При этом ещё и строки поплывут, если над данными не шаманить.

Шланг вообще сливает с 2 629 748 cycles

ЗЫ

Помню несколько лет назад на хабре была статья про оптимизацию 99 бутылок пива (автор собес проходил и его не взяли, т.к. сочли упоротым). В комментах нашлись ещё более упоротые товарищи, которые дооптимизировали вообще до блеска. Хотелось бы найти и нейронкой потыкать. Может ещё выжмет. Если кто помнит ссылку, то скиньте, там даже на гитхабе репы были.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 5)
Ответ на: комментарий от peregrine

так там ничего нового больше нет

#include <stdio.h>
int main (void) {
    /*Дерево*/
    char * color_str =
        "*#*=*#+:+#@@####*+#@@@%%+#@@%%%%%*+#%%*.\n"
        "*%##%#+#@@@@**@*%@@%#***%@%%@@#####@@%%\n"
        "+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n"
        "+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n"
        "%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n"
        "%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n"
        "*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n"
        "*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n"
        "%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%\n*"
        "%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%*\n"
        "@@#+*%@@@@@%%**#%##%%%@@@@%##%%#%@%#@%%@\n"
        "%@%*+##*#@%#%*#@%%%%%@@@*##+*%@@#%%%%##*\n"
        "#++#+*#@%@%++#%%%%%%%@@%=*%@#%#+#%@@@@%%\n"
        "*%%##**######%%#@%%%%%#%%##@@##%@@@@%##*\n"
        "##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n"
        "##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n"
        "####*==+%%%#@@#*@@@@@@%%@@%%+*##@@%#@#*#\n"
        "#%@@%%@@#%%*%@@@+#@@%%%%*#%%%@@#+%%*#%%%\n"
        "%%%%*#%%%#++#%@%@@@@%%%@%%@%--*@####%##%\n"
        "**#@@%**@%#+%%%*+#%#%@@@@@@@@@*=#*#%@##@\n"
        "%+*@@%##%@%+++*%%%%%%%@%*%@@#++%%@%*@@%*\n"
        "#####%%%@*++++++#####%%#++*@@%%@%*===*%%\n"
        "##**+#%**+++++=+####%%#======##+%*======\n"
        "%*+++===++++++===*###%*======*##+##++===\n"
        "***+++==+++++++==+#%%%#=====++++***+++++\n"
        "***+++++++++++++=+*##%#+++++++******++++\n"
        "***+++++++++++++++*%###++++++*******++++\n"
        "++++++++++++++***%#=%#*****+*********+++\n"
    ;

    int i = 0;
    char ch;
    while(ch = color_str[i++]) {
        if(ch == '@') fputs("\033[92m@\033[0m", stdout);
        else putchar(ch);
    }

    return 0;
}

madcore ★★★★★
()
Ответ на: комментарий от peregrine

такой вариант ещё проверь

#include <stdio.h>
int main (void) {
    /*Дерево*/
    char * color_str =
        "*#*=*#+:+#@@####*+#@@@%%+#@@%%%%%*+#%%*.\n"
        "*%##%#+#@@@@**@*%@@%#***%@%%@@#####@@%%\n"
        "+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n"
        "+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n"
        "%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n"
        "%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n"
        "*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n"
        "*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n"
        "%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%\n*"
        "%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%*\n"
        "@@#+*%@@@@@%%**#%##%%%@@@@%##%%#%@%#@%%@\n"
        "%@%*+##*#@%#%*#@%%%%%@@@*##+*%@@#%%%%##*\n"
        "#++#+*#@%@%++#%%%%%%%@@%=*%@#%#+#%@@@@%%\n"
        "*%%##**######%%#@%%%%%#%%##@@##%@@@@%##*\n"
        "##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n"
        "##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n"
        "####*==+%%%#@@#*@@@@@@%%@@%%+*##@@%#@#*#\n"
        "#%@@%%@@#%%*%@@@+#@@%%%%*#%%%@@#+%%*#%%%\n"
        "%%%%*#%%%#++#%@%@@@@%%%@%%@%--*@####%##%\n"
        "**#@@%**@%#+%%%*+#%#%@@@@@@@@@*=#*#%@##@\n"
        "%+*@@%##%@%+++*%%%%%%%@%*%@@#++%%@%*@@%*\n"
        "#####%%%@*++++++#####%%#++*@@%%@%*===*%%\n"
        "##**+#%**+++++=+####%%#======##+%*======\n"
        "%*+++===++++++===*###%*======*##+##++===\n"
        "***+++==+++++++==+#%%%#=====++++***+++++\n"
        "***+++++++++++++=+*##%#+++++++******++++\n"
        "***+++++++++++++++*%###++++++*******++++\n"
        "++++++++++++++***%#=%#*****+*********+++\n"
    ;

    int in_color = 0;
    const char *start = color_str;
    const char *p = color_str;

    while (*p) {
        if (*p == '@') {
            if (!in_color && p > start) {
                fwrite(start, 1, p - start, stdout);
                start = p;
            }
            if (!in_color) {
                fputs("\033[92m", stdout);
                in_color = 1;
            }
        } else {
            if (in_color) {
                fwrite(start, 1, p - start, stdout);
                fputs("\033[0m", stdout);
                in_color = 0;
                start = p;
            }
        }
        p++;
    }

    if (p > start) {
        fwrite(start, 1, p - start, stdout);
    }
    if (in_color) {
        fputs("\033[0m", stdout);
    }

    return 0;
}

madcore ★★★★★
()
Ответ на: комментарий от anonymous

Пока лопнули оптимизации от gcc, но ты присоединяйся, покажи класс. Вероятно скоро будут компиляторы с ИИ внутри для улучшения производительности скомпилированного в десятки раз.

anonymous
()
Ответ на: комментарий от anonymous

Вероятно скоро будут компиляторы с ИИ внутри

С платной подпиской с тарифами на количество использованных токенов, ой, исходного кода?

anonymous
()
Ответ на: комментарий от anonymous

Ага. Именно так. Потому что из проекта можно будет выпнуть на улицу 95% разработчиков. Хватит и одного, чтоб приглядывал за облачной ИИшницой в случае каких-то проблем. В принципе джуны уже не нужны. Да и мидлам тяжко. При желании даже будучи крепким джуном с подпиской на ИИ можно тянуть проекты, на которые ещё лет 5 назад требовалось пара сеньоров и десяток мидлов. Главное не считать себя всезнающим и не лениться задавать правильные вопросы, а также не верить ИИ на 100%. В РФ всё слабее чувствуется, потому и воплей про пузыри тут меньше (нормальные ИИ от РФ огорожены иногда даже с двух сторон и потому на внутреннем рынке разработчику не так больно, впрочем больно самому рынку — он теперь полностью неконкурентоспособен и со временем будет закупать софт у какой-нибудь Нигерии, если не сможет торговать со странами первого мира).

anonymous
()
Ответ на: комментарий от anonymous

воплей больше конечно, не буду писать когда не сплю всю ночь, а то глупые ошибки делаю

anonymous
()
Ответ на: комментарий от anonymous

С платной подпиской

Ага. Именно так.

Неужели наступит то время, когда будет ценится каждая строчка кода, и перестанут переписывать мегатонны лапша-кода?!

anonymous
()
Ответ на: комментарий от madcore

Самым быстрым должен быть однострочник. С одним циклом. Я выкладывал выше.

Вот этот. Проще уже не придумать, только если красить листья в ручную и использовать только printf. Но это будет немного другая задача, потеря автоматизации. =)

#include <stdio.h>
int main (void) {
int i;
/*Дерево*/
char  color_str[1220] = "*#*=*#+:+#@@####*+#@@@%%+#@@%%%%%*+#%%*.\n*%##%#+#@@@@**@*%@@%#***%@%%@@#####@@%%\n+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%\n*%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%*\n@@#+*%@@@@@%%**#%##%%%@@@@%##%%#%@%#@%%@\n%@%*+##*#@%#%*#@%%%%%@@@*##+*%@@#%%%%##*\n#++#+*#@%@%++#%%%%%%%@@%=*%@#%#+#%@@@@%%\n*%%##**######%%#@%%%%%#%%##@@##%@@@@%##*\n##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n####*==+%%%#@@#*@@@@@@%%@@%%+*##@@%#@#*#\n#%@@%%@@#%%*%@@@+#@@%%%%*#%%%@@#+%%*#%%%\n%%%%*#%%%#++#%@%@@@@%%%@%%@%--*@####%##%\n**#@@%**@%#+%%%*+#%#%@@@@@@@@@*=#*#%@##@\n%+*@@%##%@%+++*%%%%%%%@%*%@@#++%%@%*@@%*\n#####%%%@*++++++#####%%#++*@@%%@%*===*%%\n##**+#%**+++++=+####%%#======##+%*======\n%*+++===++++++===*###%*======*##+##++===\n***+++==+++++++==+#%%%#=====++++***+++++\n***+++++++++++++=+*##%#+++++++******++++\n***+++++++++++++++*%###++++++*******++++\n++++++++++++++***%#=%#*****+*********+++\n\0";

i=0;
while(color_str[i] != '\0' ) {

	/*Красим листья*/
	if(color_str[i] == '@')
	printf("\033[92m%c", color_str[i]);
	/*Сбрасываем цвет*/
	else
	printf("\033[0m%c", color_str[i]);
	i++;
	}
	return 0;
}

Программирование руками - когда едешь на велосипеде и знаешь, что у него есть руль, знаешь, что он прикручен, может быть, немного криво. Программирование с ИИ: это когда едешь на велосипеде, знаешь, что у него есть руль, но не знаешь точно, прикручен ли он.

AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 2)
Ответ на: комментарий от madcore

Вот код выше gcc делает в 119 строк:

	.file	"tree1.c"
	.text
	.section	.rodata
.LC1:
	.string	"\033[92m%c"
.LC2:
	.string	"\033[0m%c"
	.align 8
.LC0:
	.ascii	"*#*=*#+:+#@@####*+#@@@%%+#@@%%%%%*+#%%*.\n*%##%#+#@@@@**@*%@"
	.ascii	"@%#***%@%%@@#####@@%%\n+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%"
	.ascii	"%%%\n+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n%#####%@@@%@%"
	.ascii	"%#+%@%%%###*%@@@%%%%**@%%%#\n%#####%@@@%@%%#+%@%%%###*%@@@%%"
	.ascii	"%%**@%%%#\n*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n*%%%@%%"
	.ascii	"%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n%==%%@%#%@@@%*=*@%%%@##@@"
	.ascii	"%#*@%%%@##@@@%\n*%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%*\n@"
	.ascii	"@#+*%@@@@@%%**#%##%%%@@@@%##%%#%@%#@%%@\n%@%*+##*#@%#%*#@%%%"
	.ascii	"%%@@@*##+*%@@#%%%%##*\n#++#+*#@%@%++#%%%%%%%@@%=*%@#%#+#%@@@"
	.ascii	"@%%\n*%%##**######%%#@%%%%%#%%##@@##%@@@@%##*\n##%@@@%+%%%%#"
	.ascii	"%@@@%%@@%%%#%@@#%@@@@@@@%%#\n##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@"
	.ascii	"@@@@@@%%#\n####*==+%%%#@@#*@@@@@@%%@@%%+*##@@%#@#*#\n#%@@%%@"
	.ascii	"@#%%*%@@@+#@@%%%%*#%%%@@#+%%*#%%%\n%%%%*#%%%#++#%@%@@@@%%%@%"
	.ascii	"%@%--*@####%##%\n**#@@%**@%#+%%%*+#%#%@@@@@@@@@*=#*#%@##@\n%"
	.ascii	"+*@@%##%@%+++*%%%%%%%@%*%@@#++%%@%*@@%*\n#####%%%@*++++++###"
	.ascii	"##%%#++*@@%%"
	.string	"@%*===*%%\n##**+#%**+++++=+####%%#======##+%*======\n%*+++===++++++===*###%*======*##+##++===\n***+++==+++++++==+#%%%#=====++++***+++++\n***+++++++++++++=+*##%#+++++++******++++\n***+++++++++++++++*%###++++++*******++++\n++++++++++++++***%#=%#*****+*********+++\n"
	.string	""
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	subq	$1248, %rsp
	movq	%fs:40, %rax
	movq	%rax, -8(%rbp)
	xorl	%eax, %eax
	leaq	-1232(%rbp), %rax
	leaq	.LC0(%rip), %rdx
	movl	$143, %ecx
	movq	%rax, %rdi
	movq	%rdx, %rsi
	rep movsq
	movq	%rsi, %rdx
	movq	%rdi, %rax
	movl	(%rdx), %ecx
	movl	%ecx, (%rax)
	leaq	4(%rax), %rax
	leaq	4(%rdx), %rdx
	movzbl	(%rdx), %ecx
	movb	%cl, (%rax)
	leaq	-83(%rbp), %rdx
	movl	$0, %eax
	movb	%al, (%rdx)
	addq	$1, %rdx
	movw	%ax, (%rdx)
	addq	$2, %rdx
	movl	$8, %ecx
	movq	%rdx, %rdi
	rep stosq
	movq	%rdi, %rdx
	movl	%eax, (%rdx)
	addq	$4, %rdx
	movl	$0, -1236(%rbp)
	jmp	.L2
.L5:
	movl	-1236(%rbp), %eax
	cltq
	movzbl	-1232(%rbp,%rax), %eax
	cmpb	$64, %al
	jne	.L3
	movl	-1236(%rbp), %eax
	cltq
	movzbl	-1232(%rbp,%rax), %eax
	movsbl	%al, %eax
	movl	%eax, %esi
	leaq	.LC1(%rip), %rax
	movq	%rax, %rdi
	movl	$0, %eax
	call	printf@PLT
	jmp	.L4
.L3:
	movl	-1236(%rbp), %eax
	cltq
	movzbl	-1232(%rbp,%rax), %eax
	movsbl	%al, %eax
	movl	%eax, %esi
	leaq	.LC2(%rip), %rax
	movq	%rax, %rdi
	movl	$0, %eax
	call	printf@PLT
.L4:
	addl	$1, -1236(%rbp)
.L2:
	movl	-1236(%rbp), %eax
	cltq
	movzbl	-1232(%rbp,%rax), %eax
	testb	%al, %al
	jne	.L5
	movl	$0, %eax
	movq	-8(%rbp), %rdx
	subq	%fs:40, %rdx
	je	.L7
	call	__stack_chk_fail@PLT
.L7:
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (Gentoo 11.3.0 p7) 11.3.0"
	.section	.note.GNU-stack,"",@progbits

AnonymUser ★
() автор топика
Ответ на: комментарий от madcore

Ручная оптимизация: Можно сделать цикл while в стиле Ассемблера, при этом перевернув строку с деревом.


#include <stdio.h>
int main (void) {
int i;
/*Дерево*/
char  color_str[1220] = "+++*********+*****#%=#%***++++++++++++++\n++++*******++++++###%*+++++++++++++++***\n++++******+++++++#%##*+=+++++++++++++***\n+++++***++++=====#%%%#+==+++++++==+++***\n===++##+##*======*%###*===++++++===+++*%\n======*%+##======#%%####+=+++++**%#+**##\n%%*===*%@%%@@*++#%%#####++++++*@%%%#####\n*%@@*%@%%++#@@%*%@%%%%%%%*+++%@%##%@@*+%\n@##@%#*#=*@@@@@@@@@%#%#+*%%%+#%@**%@@#**\n%##%####@*--%@%%@%%%@@@@%@%#++#%%%#*%%%%\n%%%#*%%+#@@%%%#*%%%%@@#+@@@%*%%#@@%%@@%#\n#*#@#%@@##*+%%@@%%@@@@@@*#@@#%%%+==*####\n#%%@@@@@@@%#@@%#%%%@@%%@@@%#%%%%+%@@@%##\n#%%@@@@@@@%#@@%#%%%@@%%@@@%#%%%%+%@@@%##\n*##%@@@@%##@@##%%#%%%%%@#%%######**##%%*\n%%@@@@%#+#%#@%*=%@@%%%%%%%#++%@%@#*+#++#\n*##%%%%#@@%*+##*@@@%%%%%@#*%#%@#*##+*%@%\n@%%@#%@%#%%##%@@@@%%%##%#**%%@@@@@%*+#@@\n*%@@@##@%%%@*#%@@##@%%%@*=*%@@@%#%@%%==%*\n%@@@##@%%%@*#%@@##@%%%@*=*%@@@%#%@%%==%\n#++#%#*#%%##@@@%@%%@%@%*%%%%*%%#%%%@%%%*\n#++#%#*#%%##@@@%@%%@%@%*%%%%*%%#%%%@%%%*\n#%%%@**%%%%@@@%*###%%%@%+#%%@%@@@%#####%\n#%%%@**%%%%@@@%*###%%%@%+#%%@%@@@%#####%\n%%%%##*+%%%%###%%%%@@#*#%%%@%@@%@%#%%%#+\n%%%%##*+%%%%###%%%%@@#*#%%%@%@@%@%#%%%#+\n%%@@#####@@%%@%***#%@@%*@**@@@@#+#%##%*\n.*%%#+*%%%%%@@#+%%@@@#+*####@@#+:+#*=*#*";

i=1220;
while(i--) {

	/*Красим листья*/
	if(color_str[i] == '@')
	printf("\033[92m%c", color_str[i]);
	/*Сбрасываем цвет*/
	else
	printf("\033[0m%c", color_str[i]);

	}
	return 0;
}

AnonymUser ★
() автор топика
Ответ на: комментарий от AnonymUser

Самым быстрым должен быть однострочник. С одним циклом. Я выкладывал выше.

кому должен?
как ты пришёл к такому выводу?
самый быстрый должен быть тот, в котором выводятся сразу группы символов по цвету, либо вообще одним вызовом подготовленный буфер

я выше уже писал, что основное время работы уходит на вывод, а время «алгоритма» тут в пределах погрешности, как его не изговняй
во-вторых, функции вывода в stdout типа fputs, putchar итп обёртки изначально буферизируются, время их работы вообще рандомно
итого, если упороться и задаться скоростью, всё, что ты тут сможешь в итоге сравнить:

1. скорость вывода напрямую через write()
2. скорость fputs, fwrite итп с дефолтной построчной буферизацией
3. скорость их же с отключённой буферизацией setvbuf(stdout, NULL, _IONBF, 0)
4. наоборот, с полной буферизацией и fflush после вывода всего

а ещё, не удивляйся, что сравнительная скорость будет зависеть от того, где и как запущенно и куда происходит вывод
от данных «дерева», если их менять, кстати, тоже

т.е. данная «программа» вообще никак не годиться хоть для какого-либо бенча

madcore ★★★★★
()
Ответ на: комментарий от AnonymUser

Ручная оптимизация:

наоборот)
оно так бы могло быть на какой-нибудь 8-битке родом из 70-х, но большинство современных архитектур оптимизировано под рид-а-хед
выиграв максимум один регистр(на самом деле нет) ты просто сломаешь конвейер выборки и устроишь армагеддон в кэше

char color_str[1220] =

что опять за 1220? где ты это взял? зачем?
ты вообще пробуешь читать, что тебе пишут, раз уж темы создаёшь?

madcore ★★★★★
()
Ответ на: комментарий от madcore

Три кофе. Действительно неправильно. Интересно: редактор Geany мне одно количество символов показывает, Алиса другое. Смешанная кодировка что ли?! Ниипонятно.

AnonymUser ★
() автор топика
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария