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, чтобы создать массив строк для Ассемблера. Но, конечно, советов разной ценности дали обе сети.



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

Правильно. Российские и китайские нейронки это прошлое нейросетей трёхгодичной и двухгодичной давности соответственно. Проси 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 для размещения комментария