I am writing a program that prints A to Z and Z to A in assembly using loops, but it crashes every time after 'A' is printed out.
TITLE A to Z
;loop that prints from a to z & z to a
INCLUDE Irvine32.inc
.code
letter BYTE 65, 0
space BYTE ' ', 0
main PROC
MOV ECX, 26
myloop:
MOV EDX, offset letter
CALL writechar
INC letter
MOV EDX, offset space
CALL writechar
LOOP myloop
CALL crlf
MOV ECX, 26
myloop2:
MOV EDX, offset letter
CALL writechar
DEC letter
MOV EDX, offset space
CALL writechar
LOOP myloop2
exit
main ENDP
END main
This program uses some functions from the Irvine32.inc library, but I am sure that has nothing to do with the problem, so I disregard it for now. . . I'll provide more details if requested.
Thanks a lot!
JLL
Here's the Irvine32.inc file:
; Include file for Irvine32.lib (Irvine32.inc)
INCLUDE SmallWin.inc ; MS-Windows prototypes, structures, and constants
.NOLIST
; Last update: 1/27/02
;----------------------------------------
; Procedure Prototypes
;----------------------------------------
ClrScr PROTO ; clear the screen
Crlf PROTO ; output carriage-return / linefeed
Delay PROTO ; delay for n milliseconds
DumpMem PROTO ; display memory dump
DumpRegs PROTO ; display register dump
GetCommandTail PROTO ; get command-line string
GetDateTime PROTO, ; get system date and time
startTime:PTR QWORD
GetMseconds PROTO ; get milliseconds past midnight
Gotoxy PROTO
IsDigit PROTO ; return ZF=1 if AL is a decimal digit
Randomize PROTO ; reseed random number generator
RandomRange PROTO ; generate random integer in specified range
Random32 PROTO ; generate 32-bit random integer
ReadInt PROTO ; read signed integer from console
ReadChar PROTO ; reach single character from console
ReadHex PROTO ; read hexadecimal integer from console
ReadString PROTO ; read string from console
SetTextColor PROTO ; set console text color
WaitMsg PROTO ; display wait message, wait for Enter key
WriteBin PROTO ; write integer to output in binary format
WriteChar PROTO ; write single character to output
WriteDec PROTO ; write unsigned decimal integer to output
WriteHex PROTO ; write hexadecimal integer to output
WriteInt PROTO ; write signed integer to output
WriteString PROTO ; write null-terminated string to output
; Copy a source string to a target string.
Str_copy PROTO,
source:PTR BYTE,
target:PTR BYTE
; Return the length of a null-terminated string..
Str_length PROTO,
pString:PTR BYTE
; Compare string1 to string2. Set the Zero and
; Carry flags in the same way as the CMP instruction.
Str_compare PROTO,
string1:PTR BYTE,
string2:PTR BYTE
; Trim a given trailing character from a string.
; The second argument is the character to trim.
Str_trim PROTO,
pString:PTR BYTE,
char:BYTE
; Convert a null-terminated string to upper case.
Str_ucase PROTO,
pString:PTR BYTE
;-----------------------------------
; Standard 4-bit color definitions
;-----------------------------------
black = 0000b
blue = 0001b
green = 0010b
cyan = 0011b
red = 0100b
magenta = 0101b
brown = 0110b
lightGray = 0111b
gray = 1000b
lightBlue = 1001b
lightGreen = 1010b
lightCyan = 1011b
lightRed = 1100b
lightMagenta = 1101b
yellow = 1110b
white = 1111b
.LIST
A little pet peeve I have - You call functions called writechar
and crlf
, yet, Mr. Kip created those functions and calls them WriteChar
and Crlf
.
All you need to do is open up Irvine32.asm and look at the source for WriteChar
, at the beginning of the procedure, Mr. Irvine left this for all to see:
WriteChar PROC
;
; Write a character to the console window
; Recevies: AL = character
; Last update: 10/30/02
; Note: WriteConole will not work unless direction flag is clear.
;------------------------------------------------------
So before you call WriteChar
, you put the ASCII value of the character to print into AL
NOT the address!
MOV al, letter
CALL WriteChar
INC letter
Also, as Frank mentioned, your variables should be in the .data
or .data?
section not the .code
section