Linux 커널 Code Review 002

며칠 동안 업데이트가 안 왔어요.왜냐하면 내부 핵의 시작 코드는 어셈블리로 작성된 것이기 때문에 읽기에 그렇게 빠르지 않고 문법적인 원인도 아니다. 관건은 왜 이렇게 하는지 이해하는 것이다.
기왕 잘 읽을 준비가 되었으니 기초적인 내용부터 복습하는 김에 집필을 하겠습니다.부호를 붙이다
# printArg.s
.data
argc: .int 0
.text
.code64
.globl _start

_start:
        nop
        popq %rsi
        movq $48, %rax
        addq %rsi, %rax
        movq %rax, (argc)
        movq $1, %rdx
        leaq argc, %rsi
        movq $1, %rdi
        movq $1, %rax
        syscall
        movq $10, %rax
        movq %rax, (argc)
        movq $1, %rax
        syscall
        #A bug here, wait to be fixed.
vnext:
        popq %rsi
        test  %rsi, %rsi
        jz exit
        movq %rsi, %rdi
        xorq %rdx, %rdx
strlen:
        movb (%rdi), %al
        inc %rdx
        inc %rdi
        test %al, %al
        jnz strlen
        movb $10, -1(%rdi)
        movq $1, %rdi
        movq $1, %rax
        syscall
        jmp vnext
exit:
        movq $60,%rax 
        xorq %rdi, %rdi
        syscall

        ret

이 코드는 프로그램이 실행된 후에 매개 변수의 개수와 매개 변수의 목록을 출력합니다.문제는 매개 변수의 개수가 ASCII 디스플레이로 바뀌어야 한다는 것이다. 10이 넘는 부분은 내가 더 이상 처리하지 않았다.따라서 에서 9가 지나면 추가 ASCII 문자가 나타납니다.이것은 추후에 수정합시다.주의해야 할 것은 64bit 아래에서 시스템 호출을 할 때 여전히 적지 않은 차이가 있다는 것이다.1、unistd에 따라32h와unistd64.h 두 개의 헤더 파일에서 시스템 호출 기능에 대한 다른 정의.2. 시스템이 호출될 때register의 사용에도 약간의 차이가 있다.64bit 구조에서 주로 사용:rax,rdi,rsi,rdx;32bit 구조에서 주로 사용: eax,ebx,ecx,edx.실제 코드를 작성하는 과정에서도 적지 않은 주의점이 있다.벽돌 교류를 환영합니다.

좋은 웹페이지 즐겨찾기