%include "asm_io.inc"
segment .data
msg db "Enter a desired number of bytes: ",0
L1 dd 12, 52, 128
L2 db "assembly language",0
L3 dw 0AABBh, 0BBCCh, 0CCDDh, 0DDEEh
L4 dd 0
segment .text
global asm_main
asm_main:
enter 0,0 ; setup
pusha ; setup
mov eax, msg
call print_string
call read_int
push L1
push eax
call dumpMem ; call dumpMem
add esp, 8 ; clear the stack
end:
popa ; cleanup
mov eax, 0 ; cleanup
leave ; cleanup
ret ; cleanup
;;; This function takes a memory address and a iteration number, prints out a
;;; specified length of memory contents in hex starting from the address.
dumpMem:
push ebp ; setup
mov ebp, esp ; setup
pusha ; setup
mov ebx, [ebp + 12] ; let ebx hold the first param, where to start
mov ecx, [ebp + 8] ; let ecx hold the second param, how long to go
dump_loop:
cmp ecx, 0 ; terminate when ecx reaches 0
je dump_loop_end
dec ecx ; decrement ecx by one each loop
mov al, [ebx] ; move a 1 byte quantity to al
movzx eax, al ; extend al to 4 byte quantity value
push eax ; pass the value as the param of printHex
call printHex ; call printHex
add esp, 4 ; clean up the stack
inc ebx ; increment ebx to point to the next byte
jmp dump_loop
dump_loop_end:
call print_nl ; print a blank line at the end
popa ; clean up
mov eax, 0 ; clean up
mov esp, ebp ; clean up
pop ebp ; clean up
;;; This function takes a value (0-255), converts it to hex and print it out.
printHex:
push ebp ; setup
mov ebp, esp ; setup
pusha ; setup
mov eax, [ebp + 8] ; let eax hold the only param
cmp eax, 256 ; anything larger than 255 is invalid
jnl invalid_input
cmp eax, 0 ; anything smaller than 0 is invalid
jl invalid_input
mov edx, 0 ; clean up edx for division operation
mov ebx, 16 ; the divisor is 16
div ebx
mov ecx, edx ; the first remainder is stored in ecx
div ebx ; the second remainder is stored in edx
push edx
call printDigit ; print out the second remainder first
add esp, 4
push ecx
call printDigit ; then print out the first remainder
add esp, 4
jmp print_space ; then print out a white space
invalid_input:
mov eax, 63 ; print out ?? for invalid param
call print_char
call print_char
print_space: ; code to print white space
mov eax, 32
call print_char
popa ; clean up
mov eax, 0 ; clean up
mov esp, ebp ; clean up
pop ebp ; clean up
ret ; clean up
;;; This function takes a value (0-15), prints out as it is if it's in the
;;; range of 0-9, or prints out a letter in A-F if it's in the range of 10-15.
printDigit:
push ebp ; setup
mov ebp, esp ; setup
pusha ; setup
mov eax, [ebp + 8] ; let eax hold the only param
cmp eax, 16 ; anything larger than 15 is invalid
jnl invalid_digit
cmp eax, 0 ; anything smaller than 0 is invalid
jl invalid_digit
cmp eax, 10 ; compare the digit with 10
jl print_integer ; print as an integer if it's smaller than 10
add eax, 55 ; otherwise print as a character
call print_char
jmp printDigit_end
print_integer:
call print_int
jmp printDigit_end
invalid_digit:
mov eax, 63 ; print out a "?" for invalid param
call print_char
printDigit_end:
popa ; clean up
mov eax, 0 ; clean up
mov esp, ebp ; clean up
pop ebp ; clean up
ret ; clean up