Я пытаюсь преобразовать эту функцию c++ в mips. Я думаю, что у меня проблема в цикле, потому что когда я запускаю ее, она дает мне 13..1.17.5.. но мой вывод должен быть двумя IP-адресами: 130.52.0.10 и 171.9.50.186
c++ код функции:
void IPtoDD(int arg0, char *arg1)
{
int temp, numChar, shift = 24;
for (int i=0; i<4; i++) {
temp = arg0 >> shift;
temp = temp & 0x000000ff;
numChar = byteToDec(temp,arg1);
arg1 += numChar;
*arg1++ = '.';
shift -= 8;
}
arg1--;
*arg1 = 0;
return;
}
Код MIPS:
IPtoDD: addi $sp, $sp, -20
sw $ra, ($sp)
sw $s0, 4($sp)
sw $s1, 8($sp)
sw $s2, 12($sp)
sw $s3, 16($sp)
move $s0, $a0
move $s1, $a1
li $s3, 24 #s3=shift
li $s2, 0 #s2=i
li $t5, 0 #t5=temp
li $t3, 0
move $s1, $a1 #s1=*arg1
loop: srl $t5, $s0, $s3 #t3= numChar
and $t5, $t5, 0xff #t4= (*arg1)
move $a0, $t5
move $a1, $s1
jal byteToDec
move $t3, $v0
add $s1, $s1, $t3
li $t5, '.'
sb $t5, ($a1)
addi $a1, $a1, 1
addi $s3, $s3, -8
addi $s2, $s2, 1
blt $s2, 4, loop
addi $s1, $s1, -1
sb $0, ($a1)
lw $s3, 16($sp)
ra: lw $s2, 12($sp)
lw $s1, 8($sp)
lw $s0, 4($sp)
lw $ra, ($sp)
addi $sp, $sp, 20
jr $ra
Могли бы, пожалуйста, помочь здесь. Я много пробовал, но не смог запустить его правильно.
edit: функция c++ для byteToDec
int byteToDec(int arg0, char *arg1)
{
int temp, flag = 0, count = 0;
if (arg0==0) {
*arg1 = '0';
return 1;
}
else {
temp = arg0/100;
if (temp != 0) {
*arg1++ = (char) temp + 0x30;
count++;
flag = 1;
}
temp = (arg0 % 100) / 10;
if ((flag!=0) || (temp != 0)) {
*arg1++ = (char) temp + 0x30;
count++;
}
temp = arg0 % 10;
*arg1 = (char) temp + 0x30;
count++;
return count;
}
}
byteToDec в MIPS:
byteToDec: #t0= temp
#t1= flag
#v0= count
#t3= (*arg1)
bne $a0, $0, else
li $t3, '0'
sb $t3, ($a1)
li $v0, 1
jr $ra
else: div $t0, $a0, 100
beq $t0, 0, cont
bp2: addi $t3, $t0, 0x30
sb $t3, ($a1)
addi $a1, $a1, 1
addi $v0, $v0, 1
li $t1, 1
cont: rem $t3, $a0, 100
div $t0, $t3, 10
bne $t1, 0, nxtIf
beq $t0, 0, endElse
nxtIf: addi $t3, $t0, 0x30
sb $t3, ($a1)
addi $a1, $a1, 1
addi $v0, $v0, 1
endElse:rem $t0, $a0, 10
bp1: addi $t3, $t0, 0x30
sb $t3, ($a1)
addi $v0, $v0, 1
ra1: jr $ra
Вы используете t3
как свой счетчик циклов, а затем перетаскиваете t3
в функцию byteToDec
. Соглашение MIPS заключается в том, что t
регистры являются "temp" и не могут использоваться в таких вызовах функций. Вы должны поместить свою переменную цикла в регистр s
(регистр "save"), и если ваша вызываемая функция должна повторно использовать тот же самый s
регистр, ему необходимо сохранить его в стек или что-то еще и восстановить значение перед возвратом в вызываемый,
У меня есть программа, и в ней работает первый цикл, но второй-шестой цикл переходит в inf. Я новичок и могу использовать некоторую помощь
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;
ofstream myfile ("Atomseries.txt");
int main()
{
float rconstant=109677.58;
int nstart, nend;
int length;
for (nstart = 1; nstart <= 6; nstart++){
for (nend= 2; nend <=nstart + 10; nend++)
length = 1/(rconstant*(1/(nstart*nstart)- 1/(nend*nend)));
myfile << length * 10000000 << endl;
}
if (nstart = 1)
myfile << "Lyman Series"<< endl;
else
;
if (nstart = 2)
myfile << "B Series" << endl;
else
;
if (nstart= 3)
myfile << " series"<< endl;
return 0;
}
s
. Если вы используетеs
регистр, вам нужно сохранить дополнительное пространство в стеке, сохранитьs
регистры в стеке, затем использоватьs
регистры для того, что вы хотите, а затем восстановить значенияs
регистров из стека. Это звучит , как вы, вероятно , громя вызываемый абонент - йs
регистром. Но, да, другая альтернатива - просто убедиться, что вы используете уникальныеt
регистры между двумя вашими функциями.