요즘 어셈블리로 코딩하는 것에 재미가 들려서 그런지 계속 이런걸 만들고 있다.

어셈블리어로 printf 만드는게 그렇게 어렵다고 하길래 한번 짜보기 위해 그 기반이 될 모듈들을 만들고 있다.

아마도 포맷스트링을 처리해야 하므로 atoi는 기본으로 필요할 것 같다.

그를 위한 isAlpha와 isNumber이다.

전에 짰던 함수들도 좀 포함되어있지만 무시하도록 하자.


.globl main
main:
	push %ebp
	mov %esp, %ebp
	push $alpha
	call isNumberStr
	leave
	ret


isAlpha:
	push %ebp
	mov %esp, %ebp
	xor %eax, %eax
	movb 0x08(%ebp), %al
	movb %al, %bl
	cmpb $0x41, %al
	jl .isAlpha_notalpha
	cmpb $0x5a, %al
	jng .isAlpha_alpha
	cmpb $0x61, %al
	jl .isAlpha_notalpha
	cmpb $0x7a, %al
	jng .isAlpha_alpha
	jmp .isAlpha_notalpha
	.isAlpha_alpha:
		mov $0x01, %eax
		jmp .isAlpha_finish
	.isAlpha_notalpha:
		mov $-0x01, %eax
		jmp .isAlpha_finish
	.isAlpha_finish:
		leave
		ret

isNumber:
	push %ebp
	mov %esp, %ebp
	xor %eax, %eax
	movb 0x08(%ebp), %al
	cmpb $0x30, %al
	jl .isNumber_notnumber
	cmpb $0x39, %al
	jng .isNumber_number
	jmp .isNumber_notnumber
	.isNumber_number:
		mov $0x01, %eax
		jmp .isNumber_finish
	.isNumber_notnumber:
		mov $-0x01, %eax
		jmp .isNumber_finish
	.isNumber_finish:
		leave
		ret

isAlphaStr:
	push %ebp
	mov %esp, %ebp
	xor %ebx, %ebx
	mov 0x08(%ebp), %esi
	.isAlphaStr_loop:
		movb (%esi), %bl
		and $0xff, %ebx
		cmpb $0x00, %bl
		je .isAlphaStr_Alpha
		push %ebx
		call isAlpha
		cmpb $0x00, %al
		jl .isAlphaStr_notAlpha
		inc %esi
		jmp .isAlphaStr_loop
	.isAlphaStr_Alpha:
		mov $0x01, %eax
		jmp .isAlphaStr_finish
	.isAlphaStr_notAlpha:
		mov $-0x01, %eax
		jmp .isAlphaStr_finish
	.isAlphaStr_finish:
		leave
		ret

isNumberStr:
	push %ebp
	mov %esp, %ebp
	xor %ebx, %ebx
        mov 0x08(%ebp), %esi
        .isNumberStr_loop:
                movb (%esi), %bl
                and $0xff, %ebx
                cmpb $0x00, %bl
                je .isNumberStr_Number
                push %ebx
                call isNumber
                cmpb $0x00, %al
                jl .isNumberStr_notNumber
                inc %esi
                jmp .isNumberStr_loop
        .isNumberStr_Number:
                mov $0x01, %eax
                jmp .isNumberStr_finish
        .isNumberStr_notNumber:
                mov $-0x01, %eax
                jmp .isNumberStr_finish
        .isNumberStr_finish:
                leave
                ret
	leave
	ret

puts:
	push %ebp
	mov %esp, %ebp
	mov 0x08(%ebp), %eax
	push %eax
	call strlen
	mov %eax, %edx
	mov $0x04, %eax
	mov $0x01, %ebx
	mov 0x08(%ebp), %ecx
	int $0x80
	push $0x0a
	lea (%esp), %ecx
	mov $0x04, %eax
	mov $0x01, %ebx
	mov $0x01, %edx
	int $0x80
	add $0x04, %esp
	leave
	ret

strcpy:
	push %ebp
	mov %esp, %ebp
	xor %eax, %eax
	mov 0x08(%ebp), %edi
	mov 0x0c(%ebp), %esi
	.strcpy_loop:
		movb (%esi), %al
		movb %al, (%edi)
		cmpb $0x00, %al
		je .strcpy_finish
		inc %esi
                inc %edi
		jmp .strcpy_loop
	.strcpy_finish:
		leave
		ret


strlen:
	push %ebp
	mov %esp, %ebp
	xor %ecx, %ecx
	mov 0x08(%ebp), %eax
	.strlen_loop:
		movb (%eax), %bl
		cmpb $0x00, %bl
		je .strlen_finish
		inc %eax
		inc %ecx
		jmp .strlen_loop
	.strlen_finish:
		mov %ecx, %eax
		leave
		ret

alpha : .string "12345678a0"
helloworld : .string "Hello, World"


'Programming' 카테고리의 다른 글

[C++] 가상함수(Virtual Function)  (0) 2016.01.20
Assembly Programming - atoi  (0) 2015.10.11
Assembly Programming - gets  (0) 2015.10.10
Assembly Programming - strchr  (0) 2015.10.10
Assembly Programming - puts  (0) 2015.10.10
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,