요즘 어셈블리로 코딩하는 것에 재미가 들려서 그런지 계속 이런걸 만들고 있다.
어셈블리어로 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 |