| UMBC |
CMSC 313 -- Multiplication/Division Program |
|
mul.asm
;; This section is for defining constants, such as filenames or buffer sizes,
;; It includes the initialized variables
section .data
miles DW 180
gallons DW 6
mpg DW 0
nrDays DB 141
weeks DB 0
days DB 0
string1 DB 'mpg is %d', 10,0
string2 DB 'Second try is %d', 10, 0
string3 DB 'The number of hours in a week is %d', 10, 0
bigNum DD 0
;; This section is where you declare your uninitialized variables.
section .bss
;; This is where the actual assembly code is written.
section .text
global main ;must be declared for linker (ld)
extern printf
main: ;tell linker entry point
;; put your code here
mov ax, word [miles]
cwd ;ax is assumed
idiv word [gallons] ;ax is assumed
mov [mpg], ax
mov eax, 0
mov ax, [mpg]
push eax
push string1
call printf
add esp, 8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; DANGER: What happens with the registers when you call
;; another function?
;;
;; Let's look at it. Repeat the pushes and call
;; printf again!
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
push eax
push string2
call printf
add esp, 8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Something changed ax!
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov al, [nrDays]
sub ah, ah ;don't sign extend because that
; would change the value
mov bl, 7
div bl ;can't use a constant here!
mov [weeks], al
mov [days], ah ;the remainder is the portion
;
; One more example, this time with multiplication of a unsigned number
;
mov ax, 24 ; there are 24 hours in a day
mov bx, 7 ; How many hours in a week?
mul bx ; Calculate the answer
push eax
push string3
call printf
add esp, 8
;; The final part of the program must be a call to the operating system to exit
;;; the program.
mov ebx,0 ;successful termination of program
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
;; Notice the file just ends.
©2004, Gary L. Burt