TheTechGuysNYC
asked on
Assembly Language: multiplying
I am writing a program in MIPS assembly language with PCSpim. I want it to be able to Divide. Here is what I have. Any suggestions?
.data
.globl firstNum
.globl secondNum
firstNum: .asciiz"\nWhat is the First Number?\n"
secondNum: .asciiz"\nWhat is the Second Number?\n"
space: .asciiz"\n"
remainder: .asciiz" Remainder: "
.text
.globl main
main:
addu $s7, $0, $ra
#Queries user for first number
li $v0, 4
la $a0, firstNum
syscall
li $v0, 5
syscall
add $t1,$v0,$zero
#Asks for the second number
li $v0, 4
la $a0, secondNum
syscall
li $v0, 5
syscall
add $t2,$v0,$zero
div $t1,$t2
mfhi $t4
mflo $t5
#Space
li $v0, 4
la $a0, space
syscall
add $a0,$t5,$zero
li $v0, 1
syscall
#Remainder
li $v0, 4
la $a0, remainder
syscall
add $a0,$t4,$zero
li $v0, 1
syscall
addu $ra, $0, $s7
jr $ra
add $0, $0, $0
.data
.globl firstNum
.globl secondNum
firstNum: .asciiz"\nWhat is the First Number?\n"
secondNum: .asciiz"\nWhat is the Second Number?\n"
space: .asciiz"\n"
remainder: .asciiz" Remainder: "
.text
.globl main
main:
addu $s7, $0, $ra
#Queries user for first number
li $v0, 4
la $a0, firstNum
syscall
li $v0, 5
syscall
add $t1,$v0,$zero
#Asks for the second number
li $v0, 4
la $a0, secondNum
syscall
li $v0, 5
syscall
add $t2,$v0,$zero
div $t1,$t2
mfhi $t4
mflo $t5
#Space
li $v0, 4
la $a0, space
syscall
add $a0,$t5,$zero
li $v0, 1
syscall
#Remainder
li $v0, 4
la $a0, remainder
syscall
add $a0,$t4,$zero
li $v0, 1
syscall
addu $ra, $0, $s7
jr $ra
add $0, $0, $0
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Couple of things:
You really need to check your input of number2 to make sure it's not zero.
Since technically you're doing MOD you want the remainder of the integer division so you dont want the lo-byte , you want the hi-byte. (your code shows this), so use mfhi not mflo.
Now onto my issues with the code:
>> add $t2,$v0,$zero
Technically this is okay $t2 = $v0 + 0, fine but wouldnt "move $t2,$v0" be easier? You do this several times in your code.
>>add $a0,$t5,$zero
>>li $v0, 1
>>syscall
You're outputing a space before this, but this is just the quotient, so you're going to end up with output like for the case of 48 / 7 -> " 6Remainder: 49", is this what you wnat?
You really need to check your input of number2 to make sure it's not zero.
Since technically you're doing MOD you want the remainder of the integer division so you dont want the lo-byte , you want the hi-byte. (your code shows this), so use mfhi not mflo.
Now onto my issues with the code:
>> add $t2,$v0,$zero
Technically this is okay $t2 = $v0 + 0, fine but wouldnt "move $t2,$v0" be easier? You do this several times in your code.
>>add $a0,$t5,$zero
>>li $v0, 1
>>syscall
You're outputing a space before this, but this is just the quotient, so you're going to end up with output like for the case of 48 / 7 -> " 6Remainder: 49", is this what you wnat?
Sorry, it should read:
" 6Remainder:1"
" 6Remainder:1"
ASKER
Actually, Brian. I was hoping you would respond... I wanted it to come out "6 Remainder 1" although I guess it really does not matter. As long as the answer comes out correctly...
Why would the move command you suggest be easier?
Why would the move command you suggest be easier?
>>Why would the move command you suggest be easier?
It's not Easier to write...it's Easier to read. That's what you're doing, you're moving something from one place to another if you have an instruction that will do that, then why not use it? Know what I mean?
It's not Easier to write...it's Easier to read. That's what you're doing, you're moving something from one place to another if you have an instruction that will do that, then why not use it? Know what I mean?
I have not tested your code but it seems to be correct.
If you would like, tommorrow I will test this code and the code from your multiply question for you.
The code you originally posted works just fine as I thought...It also showed that the division i did in my head was incorrect :0
Output:
What is the first number?
49
What is the second number?
7
6 Remainder: 6
Output:
What is the first number?
49
What is the second number?
7
6 Remainder: 6
ASKER
Yea, unfortunately I tested it further and it does not seem to work with negative numbers for some reason...
ASKER
>>It's not Easier to write...it's Easier to read. That's what you're doing, you're moving something from one place to another if you have an instruction that will do that, then why not use it? Know what I mean?
I know exactly what you mean and it makes perfect sense
I know exactly what you mean and it makes perfect sense
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Divi is signed division /w immediate addressing.
I don't think an even split is fair.
ASKER