Tried to tack this onto an old thread, but she got no love.
I'm running into some issues with a macro in my program.
lab8.asm
INCLUDE input
INCLUDE input2
.MODEL SMALL
.STACK 100h
.DATA
basePrompt db 'Please enter a number for the base: $'
expPrompt db 'Please enter a number to raise the base to: $'
base db ?
exp db ?
binBase db ?
binExp db ?
baseSize db ?
expSize db ?
answerSize db ?
answer dw 1
divider db 10
ASCIIanswer dw ?
cheat db '$'
.CODE
EXTRN GETNUMBER:far, PUTNUMBER:far, POWER:far
MAIN PROC
mov ax, @data
mov ds, ax
lea dx, basePrompt
mov ah, 09h
int 21h ;display prompt
INPUT base ;get base number
lea dx, expPrompt
mov ah, 09h
int 21h ;display prompt
INPUT2 exp ;get exponent
call GETNUMBER ;convert numbers to binary
mov ax, 0
mov al, binBase
call GETSIZE ;get number of digits in base
;mov baseSize, bl ;set base size
mov ax, 0
mov al, binExp
call GETSIZE ;get number of digits in exp
;mov expSize, bx ;set exp size
call POWER ;raise base to exp power
mov ax, answer
call GETSIZE ;get number of digits in answer
mov bx, 0
mov answerSize, bl ;set answer size
call PUTNUMBER ;convert answer to ascii for printing
call PRINT ;print answer
mov ax, 4c00h
int 21h ;terminate program
MAIN ENDP
GETSIZE PROC
cmp ax, 10000 ;compare num to 10000
jb NOT5 ;if smaller, jump to NOT5
mov bx, 5 ;else size = 5
NOT5:
cmp ax, 1000 ;compare num to 1000
jb NOT4 ;if smaller, jump to NOT4
mov bx, 4 ;else size = 4
NOT4:
cmp ax, 100 ;compare num to 100
jb NOT3 ;if smaller, jump to NOT3
mov bx, 3 ;else size = 3
NOT3:
cmp ax, 10 ;compare num to 10
jb CONTINUE1 ;if smaller, size = 1
mov bx, 2 ;else size = 2
CONTINUE1:
mov bx, 1 ;size = 1
ret
GETSIZE ENDP
PRINT PROC
mov ax, ASCIIanswer
mov ah, 09h
int 21h ;print answer
PRINT ENDP
END MAIN
input
INPUT MACRO addr
lea bx, addr ;load addr into bx
mov cx, 2 ;set counter to 2
mov si, 0 ;set pointer to 0
INLOOP:
mov ah, 01h
int 21h ;get char from keyboard
mov bx + si, al ;put char into bx
inc si
loop INLOOP
ENDM
This is the output I get upon trying to assemble lab8.asm:
Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International
Assembling file: lab8.asm
**Error** lab8.asm(61) INPUT(8) Too many registers in expression
**Error** lab8.asm(66) INPUT2(8) Too many registers in expression
Error messages: 2
Warning messages: None
Passes: 1
Remaining memory: 413k
Tool completed with exit code 1
Mind you, this is 16 bit assembly for x86. Why is it complaining about the macro?
Posts
It looks like it's complaining about one of these two lines, depending how it counts line numbers in macros:
int 21h
mov bx + si, al
The int seems to look fine, so my hunch is that you're not allowed to add bx and si together like that. I don't know if that's actually true, but I notice you don't do it anywhere else in the code there. Try summing them in an extra register first (if you have a free one) and using that in the mov statement instead.
See how many books I've read so far in 2010
Yea that looks invalid.
If you need to put AL into the address [BX plus an offset of SI] then you will have to store that address in another register first, then do a mov of AL to that address.
Edit: beat to the punch!
Is what you want.
Ha, sorry about the other thread - absolutely forgot about it last night.
EDIT: Woah, lots of answers all of a sudden. Anyway, no need to have another register - you can directly add si to bx in this context.