๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

ํ”„๋กœ์ ํŠธ/์‹œ์Šคํ…œ ํ•ดํ‚น

[์‹œ์Šคํ…œ ํ•ดํ‚น] ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ๋ณ„ ํ”ผ๋ผ๋ฏธ๋“œ ๋งŒ๋“ค๊ธฐ (2)

728x90

2023.01.18 - [ํ”„๋กœ์ ํŠธ/์‹œ์Šคํ…œ ํ•ดํ‚น] - [์‹œ์Šคํ…œ ํ•ดํ‚น] ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ๋ณ„ ํ”ผ๋ผ๋ฏธ๋“œ ๋งŒ๋“ค๊ธฐ (1)

 

[์‹œ์Šคํ…œ ํ•ดํ‚น] ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ๋ณ„ ํ”ผ๋ผ๋ฏธ๋“œ ๋งŒ๋“ค๊ธฐ (1)

https://youtu.be/FFFr5GnelJI ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋ฅผ ์ด์šฉํ•ด์„œ ๋ณ„ ํ”ผ๋ผ๋ฏธ๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋ณธ๋‹ค. $nano pyramid.s ๋ณ„ ํ”ผ๋ผ๋ฏธ๋“œ๋ฅผ ๋งŒ๋“ค ์†Œ์Šค์ฝ”๋“œ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์ค€๋‹ค. section .data STAR db '*' EMPTY db 0x0a section .text global _start _start:

dangsdangs.tistory.com

์ด ๊ธ€์— ์ด์–ด์„œ ๋ณ„ ํ”ผ๋ผ๋ฏธ๋“œ๋ฅผ ์™„์„ฑํ•ด๋ณธ๋‹ค.

https://youtu.be/2wFN9BG3wWw

ํ•ด๋‹น ์œ ํŠœ๋ธŒ๋ฅผ ๋ณด๋ฉฐ ๊ณต๋ถ€ํ•œ๋‹ค.


#include <stdio.h>

int main(void){
	int n=7,i,j;
    for(int i=0; i<n; i++){
    	for(int j=0;j<=i;j++){
        	printf("*");
        }
        printf("\n");
    }
    for(int i=n-1; i>0; i--){
    	for(int j=0;j<i;j++){
        	printf("*");
        }
        printf("\n");
    }
    return 0;
}

ํ˜„์žฌ ์ž‘์„ฑํ•˜๋ ค๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ์ฝ”๋“œ๋ฅผ C์–ธ์–ด๋กœ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

r10๊ณผ  r9๊ฐ€ ๊ฐ๊ฐ j, i ์—ญํ• ์ด ๋œ๋‹ค.

section .data
        STAR db '*'
        EMPTY db 0x0a

section .text
        global _start

_start:
        mov rax,1 ;WRITE ์‹œ์Šคํ…œ ์ฝœ ์„ค์ •
        mov rdi,1 ;๊ธฐ๋ณธ ์ถœ๋ ฅ ๋ชจ๋“œ
        mov rdx,1 ;์ถœ๋ ฅ ๊ธธ์ด ์„ค์ •
        mov r10,0 ;์ธ๋ฑ์Šค (๋ฐ˜๋ณต๋ฌธ์— ์‚ฌ์šฉ)์ˆ˜
        mov r9,[rsp+16] ;์ž…๋ ฅ๋œ ๋ฌธ์ž์—ด ์ฐพ๊ธฐ

        cmp r9,0 ;์ž…๋ ฅ์ด ์—†๋Š” ๊ฒฝ์šฐ
        je _done ;ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ

        mov cl,[r9] ;์˜ค์ง ํ•œ ๋ฐ”์ดํŠธ๋งŒ cl์— ์ €์žฅ
        movzx r9,cl ;๋ฌธ์ž ํ˜•ํƒœ์˜ cl์„ r9์— ์ €์žฅ
        sub r9, 0x30 ;r9๊ฐ€ ์ธ๋ฑ์Šค๊ฐ€ ๋จ

        mov r8,r9
        xor r9,r9
        call _syscall ;์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค syscallํ•จ

_small:
        cmp r10, r9
        je _up;
        mov rsi, STAR ;๋ณ„ ์ถœ๋ ฅ
        syscall ;์ถœ๋ ฅ
        mov rax,1 ;WRITE ์‹œ์Šคํ…œ ์ฝœ ์„ค์ •
        inc r10 ;j๋ฅผ 1 ์ฆ๊ฐ€
        jmp _small ;์ž๊ธฐ์ž์‹  ํ˜ธ์ถœ

_up:
        cmp r9,r8 ;i==n์ด ๋œ ๊ฒฝ์šฐ
        je _down ;๋‚ด๋ ค๊ฐ€๋Š” ํ•จ์ˆ˜ ์‹คํ–‰
        mov rsi, EMPTY ;์ค„๋ฐ”๊ฟˆ ์ถœ๋ ฅ
        syscall
        mov rax,1
        mov r10,0
        add r9,1
        jmp _small

_down:
        cmp r9,0 ;i๊ฐ€ 0์ด ๋œ ๊ฒฝ์šฐ
        je _done
        mov rsi,EMPTY ;i๊ฐ€ 0์ด์•„๋‹Œ๊ฒฝ์šฐ ์ค„๋ฐ”๊ฟˆ ์„ค์ •
        syscall;
        mov rax, 1
        mov r10,0 ;j์ดˆ๊ธฐํ™”
        sub r9,1 ;i๋ฅผ 1 ๊ฐ์†Œ
        jmp _big ;๋‹ค์‹œ ์ถœ๋ ฅ

_big:
        cmp r10,r9 ; i==j
        je _down
        mov rsi,STAR
        syscall
        mov rax,1
        inc r10
        jmp _big

_done:
        mov rax,60
        mov rdi,0
        syscall

_syscall:
        syscall
        ret

_small, _big์€ c์–ธ์–ด๋กœ ์น˜๋ฉด ์•ˆ์˜ for๋ฌธ์ด๊ณ ,

_up, _down์€ i๊ฐ€ ๋ณ€ํ•˜๋Š” ๋ฐ– for๋ฌธ์ด ๋œ๋‹ค.

$nasm -f elf64 -o pyramid.o pyramid.s
$ld -o pyramid pyramid.o
$ ./pyramid 7

์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ๋กœ ๋ณ€๊ฒฝ ํ›„ ์‹คํ–‰์‹œ์ผœ๋ณธ๋‹ค.

์•„์ฃผ ์ž˜ ์ž‘๋™ํ•œ๋‹ค!