;;; =======================================================================
;;; firstProg.asm
;;; Tsui Mei Chang
;;; This program prints descending rows of stars using loops
;;; example of output:
;;;
;;; *********************
;;; ********************
;;; *******************
;;; ******************
;;; *****************
;;; ****************
;;; ***************
;;; **************
;;; *************
;;; ************
;;; ***********
;;; **********
;;; *********
;;; ********
;;; *******
;;; ******
;;; *****
;;; ****
;;; ***
;;; **
;;; *
;;;
;;; to assemble, link and run:
;;;
;;; nasm -f elf -F stabs firstProg.asm
;;; ld -o firstProg firstProg.o
;;; ./firstProg
;;;
;;; =======================================================================
;;; ==================================
;;; CONSTANTS
;;; ==================================
%assign ENDL 0x0A ; end of line
%assign SYS_EXIT 1
%assign SYS_READ 3
%assign SYS_WRITE 4
%assign STDIN 0
%assign STDOUT 1
;;; ==================================
;;; DATA SEGMENT
;;; ==================================
section .data
stars db "*********************" ; the row of stars of be decremented
stars_len equ $ - stars ; length of the message
len dd stars_len ; stores the length of the star row
newline db ENDL ; the new line character
line_len equ 1 ; length of the newline
;;; ==================================
;;; CODE SEGMENT
;;; ==================================
section .text
global _start
_start:
mov ecx,21 ; get ready to print 21 lines
printloop:
call printstars ; calls the star printing function
call printline ; calls the new line printing function
dec dword [len] ; decrements the length of the line of stars
loop printloop ; decrements ecx and starts loop again
;; exit program, return to OS
mov eax, SYS_EXIT ; select exit sys call
xor ebx, ebx ; exit code
int 0x80
;;; ========================================================
;;; printline: prints the row of stars with a given length
;;; REGISTERS MOFIFIED: EAX, EBX, ECX, EDX
;;; ========================================================
printstars:
section .bss
.temp resd 1 ; temporary var to store ecx
section .text
mov eax, SYS_WRITE
mov ebx, STDOUT
mov edx, dword [len] ; get VARIABLE message length
mov dword [.temp], ecx ; save ecx
lea ecx, [stars] ; message to be output
int 0x80
mov ecx, dword [.temp] ; restores original ecx
ret
;;; ========================================================
;;; printline: prints the new line
;;; registers mofified: eax, ebx, ecx, edx
;;; ========================================================
printline:
section .bss
.temp resd 1 ; temporary var to hold ecx
section .text
mov eax, SYS_WRITE
mov ebx, STDOUT
mov edx, line_len ; CONSTANT message length
mov dword [.temp], ecx ; stores ecx in temp before it is changed
lea ecx, [newline] ; message to be output
int 0x80
mov ecx, dword [.temp] ; restores original ecx
ret