C Challenge #1 in NASM (slightly modified)

+1 c student · June 12, 2015
Done on Win32.  I didn't add a check in for the dollar sign because too lazy...
; Author                                             : c student
; Created date                                       : 12/06/2015 (DD/MM/YYYY)
; Last update                                        : 12/06/2015 (DD/MM/YYYY)
; Version                                            : 1.0
; Description                                        : C Challenge #1 in Win32 NASM

section .data                                        ; initialised data section

message  db   "Please enter in a string greater than %d and no longer than %d characters: ", 0xD, 0xA, 0
strscn   db   "%30s", 0
output   db   '"%s" is accepted.', 0xD, 0xA, 0
errmsg   db   "There was an error with your input. Please try again.", 0xD, 0xA, 0
upper    dd   0
digit    dd   0

minlen   equ  0x8
maxlen   equ  0x1E

section .bss                                         ; uninitialised data section

buf resb 31 ; input buffer

SECTION .text ; code section

global _main
extern _printf
extern _scanf
extern _strlen
extern _isdigit
extern _isupper

   mov ebp, esp                                      ; set up stack
   push DWORD maxlen                                 ; max length characters
   push DWORD minlen                                 ; min length characters
   push DWORD message                                ; set up string for printf
   call _printf                                      ; print string
   add esp, 0xC                                      ; reset stack pointer

; scan input
   xor eax, eax
   push DWORD buf                                    ; set up scanf return value
   push DWORD strscn                                 ; string format
   call _scanf                                       ; input string
   cmp eax, 0x0                                      ; check return value
   jle err                                           ; handle error
   add esp, 0x4                                      ; reset stack pointer
   pop esi

; get string length
   xor eax, eax                                      ; setup up for string length
   push DWORD esi                                    ; set up buffer for strlen
   call _strlen                                      ; get string length
   mov edx, eax                                      ; relocate return
   pop esi                                           ; reset stack pointer

; test input
   xor edi, edi
   xor ecx, ecx
   cmp edi, edx                                      ; check if equal string length
   je check                                          ; exit loop if equal
   xor ebx, ebx                                      ; reset ebx
   mov BYTE bl, [esi+edi]                            ; get buffer element
   push DWORD ebx                                    ; load element
   jmp isdigit                                       ; check character
cont:                                                ; continue loop
   add esp, 0x4                                      ; reset stack pointer
   inc edi                                           ; increment loop
   jmp begin                                         ; loop

   cmp edi, minlen                                   ; check minimum length
   jl err                                            ; jump to error if < minimum length
   cmp DWORD [digit], 0x0                            ; check digits
   jle err                                           ; jump to error if < = 0
  cmp DWORD [upper], 0x0                            ; check uppercase
  jle err                                           ; jump to error if < = 0

  push DWORD buf                                    ; load buffer
  push DWORD output                                 ; load message
  call _printf                                      ; print message
  add esp, 0x8                                      ; reset stack pointer

  mov ebp, esp                                      ; reset stack pointer
  xor eax, eax                                      ; zero eax
  ret                                               ; finish

  call _isdigit                                     ; check digit
  cmp eax, 0x0                                      ; check return value
  je isupper                                        ; jump if !digit
  or DWORD [digit], 0x1                             ; digit = 1 if digit

  call _isupper                                     ; check if uppercase
  cmp eax, 0x0                                      ; check return value
  je cont                                           ; jump back to main loop if !uppercase
  or DWORD [upper], 0x1                             ; upper = 1 if uppercase
  jmp cont                                          ; jump back to main loop

  push DWORD errmsg                                 ; load error message
  call _printf                                      ; print message
  add esp, 0x04                                     ; reset stack pointer
  jmp end                                           ; finish

I have way too much time on my hands.

Post a Reply


- page 2
Oldest  Newest  Rating
0 c student · June 19, 2015
Nice, I'll check it out.
  • 1
  • 2



Language that is commonly used in operating systems, compilers, and other low level programs.

Bucky Roberts Administrator