Voting

Category

assembly language

Bookmarking

Del.icio.us Digg Diigo DZone Earthlink Google Kick.ie
Windows Live LookLater Ma.gnolia Reddit Rojo StumbleUpon Technorati

Language Assembler (Intel 8086)

Date:04/20/05
Author:Alan de Lespinasse
URL:n/a
Comments:2
Info:n/a
Score: (2.88 in 41 votes)
; 99 Bottles of Beer program in Intel 8086 assembly language.
; Assemble to a .COM file for MS-DOS.
;
; Author: Alan deLespinasse
; aldel@alum.mit.edu
; www.aldel.com

code segment
assume cs:code,ds:code
org 100h
start:


; Main loop

mov cx, 99                    ; bottles to start with

loopstart:

call printcx                  ; print the number
mov dx,offset line1           ; print the rest of the first line
mov ah,9                      ; MS-DOS print string routine
int 21h

call printcx                  ; print the number
mov dx,offset line2_3         ; rest of the 2nd and 3rd lines
mov ah,9
int 21h

dec cx                        ; take one down
call printcx                  ; print the number
mov dx,offset line4           ; print the rest of the fourth line
mov ah,9
int 21h

cmp cx, 0                     ; Out of beer?
jne loopstart                 ; if not, continue

int 20h                       ; quit to MS-DOS


; subroutine to print CX register in decimal

printcx:

mov di, offset numbufferend   ; fill the buffer in from the end
mov ax, cx                    ; put the number in AX so we can divide it

printcxloop:
mov dx, 0                     ; high-order word of numerator - always 0
mov bx, 10
div bx                        ; divide DX:AX by 10. AX=quotient, DX=remainder
add dl,'0'                    ; convert remainder to an ASCII character
mov [ds:di],dl                ; put it in the print buffer
cmp ax,0                      ; Any more digits to compute?
je printcxend                 ; if not, end
dec di                        ; put the next digit before the current one
jmp printcxloop               ; loop

printcxend:
mov dx,di                     ; print, starting at the last digit computed
mov ah,9
int 21h
ret


; Data

line1 db ' bottles of beer on the wall,',13,10,'$'
line2_3 db ' bottles of beer,',13,10,'Take one down, pass it around,',13,10,'$'
line4 db ' bottles of beer on the wall.',13,10,13,10,'$'
numbuffer db 0,0,0,0,0
numbufferend db 0,'$'

code ends
end start

Download Source | Write Comment

Alternative Versions

Comments

>>  Tamplier said on 06/27/05 16:14:03

Tamplier What about "no more bottles of beer" and "to buy more beer"? Franckly speaking this song is never ending story.

>>  The Caveman said on 07/31/05 09:38:57

The Caveman woohoo! more beer!

Download Source | Write Comment

Add Comment

Please provide a value for the fields Name, Comment and Security Code.
This is a gravatar-friendly website.
E-mail addresses will never be shown.
Enter your e-mail address to use your gravatar.

Please don't post large portions of code here! Use the form to submit new examples or updates instead!

Name:

eMail:

URL:

Security Code:
  
Comment: