Вход на сайт
Дайте направление решения задачи.
15.05.15 12:56
Здравствуйте. Помогите найти решение по второму заданию.
Первое я решила, а второе (Rest berechnen) не знаю с чего начать. Vожет кто подскажет с какого шага нужно начать и как это выглядит. Спасибо. А то совсем идей нет(((
Первое я решила, а второе (Rest berechnen) не знаю с чего начать. Vожет кто подскажет с какого шага нужно начать и как это выглядит. Спасибо. А то совсем идей нет(((
NEW 15.05.15 13:32
Как я понимаю, подпрограмма должна найти остаток от деления числа из Puffer с десятичной записью: a_n a_{n-1} a_{n-2} ... a_0 на
число, записанное в Teiler.
Десятичное число в Puffer нужно представить так:
((((( a_n * 10 + a_{n-1} )*10 + a_{n-2})*10 + .... ) *10 + a_0
А далее поиск остатка от деления X ищется в цикле:
X <- остаток от деления ( a_n * 10 + a_{n-1} ) на Teiler
X <- остаток от деления X*10 + a_{n-2} на Teiler
X <- остаток от деления X*10 + a_{n-3} на Teiler ....
X <- остаток от деления X*10 + a_0 на Teiler.
Вот, вроде, и все.
P.S. a_{...} это я так обозначал индекс, "a маленькое ... снизу" (запись из LaTeX :)) )
число, записанное в Teiler.
Десятичное число в Puffer нужно представить так:
((((( a_n * 10 + a_{n-1} )*10 + a_{n-2})*10 + .... ) *10 + a_0
А далее поиск остатка от деления X ищется в цикле:
X <- остаток от деления ( a_n * 10 + a_{n-1} ) на Teiler
X <- остаток от деления X*10 + a_{n-2} на Teiler
X <- остаток от деления X*10 + a_{n-3} на Teiler ....
X <- остаток от деления X*10 + a_0 на Teiler.
Вот, вроде, и все.
P.S. a_{...} это я так обозначал индекс, "a маленькое ... снизу" (запись из LaTeX :)) )
NEW 15.05.15 14:08
тут есть описание с примером
http://de.wikipedia.org/wiki/IBAN
1.Setze die beiden Prüfziffern auf 00 (die IBAN beginnt dann z. B. mit DE00 für Deutschland).
2.Stelle die vier ersten Stellen an das Ende der IBAN.
3.Ersetze alle Buchstaben durch Zahlen, wobei A = 10, B = 11, …, Z = 35.
4.Berechne den ganzzahligen Rest, der bei Division durch 97 bleibt.
5.Subtrahiere den Rest von 98, das Ergebnis sind die beiden Prüfziffern. Falls das Ergebnis einstellig ist, wird es mit einer führenden Null ergänzt.
Хотя надо еще с заданием сравнить, может они по другому хотят. Но в принципе нужно по определенному алгоритму, подсчитать контрольное число.
А в чем именно проблемы возникли?
Это оказывается задание 3, а второе как бы подготовка к нему
http://de.wikipedia.org/wiki/IBAN
1.Setze die beiden Prüfziffern auf 00 (die IBAN beginnt dann z. B. mit DE00 für Deutschland).
2.Stelle die vier ersten Stellen an das Ende der IBAN.
3.Ersetze alle Buchstaben durch Zahlen, wobei A = 10, B = 11, …, Z = 35.
4.Berechne den ganzzahligen Rest, der bei Division durch 97 bleibt.
5.Subtrahiere den Rest von 98, das Ergebnis sind die beiden Prüfziffern. Falls das Ergebnis einstellig ist, wird es mit einer führenden Null ergänzt.
Хотя надо еще с заданием сравнить, может они по другому хотят. Но в принципе нужно по определенному алгоритму, подсчитать контрольное число.
А в чем именно проблемы возникли?
Это оказывается задание 3, а второе как бы подготовка к нему
NEW 15.05.15 15:24
в ответ BorisL0 15.05.15 13:32
Это, я так понимаю, схема Горнера?
Но мне сначала нужно дать определение мода. У меня же нет ее в списке. Может это глупость, что пишу. Но у меня на ум приходит только это. С мат. точки зрения mod (a, b) = a kleiner b, dann a/ Wenn a groser b, dann mod (a-b, b)/
Тогда можно написать так?
mod :
blt $a0, $a1, fertig
subbu $a0, $a0, $a1
beq $zero, $zero, mod
fertig:
addu $v0, $zero, $a0
jr $ ra
А дальше это нужно вписать в формулу Горнера с этим модом, как в двух формулах в задании при сложении и умножении чисел. Так? Каким кодом это показать?
Но мне сначала нужно дать определение мода. У меня же нет ее в списке. Может это глупость, что пишу. Но у меня на ум приходит только это. С мат. точки зрения mod (a, b) = a kleiner b, dann a/ Wenn a groser b, dann mod (a-b, b)/
Тогда можно написать так?
mod :
blt $a0, $a1, fertig
subbu $a0, $a0, $a1
beq $zero, $zero, mod
fertig:
addu $v0, $zero, $a0
jr $ ra
А дальше это нужно вписать в формулу Горнера с этим модом, как в двух формулах в задании при сложении и умножении чисел. Так? Каким кодом это показать?
NEW 15.05.15 17:50
Можно и рекурсивно сделать но при больших числах будет неээфективно.
http://borlpasc.narod.ru/docym/le/pract/scalar/ostat.htm
Res := X - Trunc (X / Y) * Y;
Но я тоже не знаю как на вашем ассемблере реализуются операции с плавающей точкой и как real преобразовать в integer (это делает Trunc - не округляет, а отсекает дробную часть)
Пишите лучше на псевдокоде, тогда больше людей смогут его понять.
в ответ lisenkalejka 15.05.15 15:24
В ответ на:
Но у меня на ум приходит только это
Но у меня на ум приходит только это
Можно и рекурсивно сделать но при больших числах будет неээфективно.
http://borlpasc.narod.ru/docym/le/pract/scalar/ostat.htm
Res := X - Trunc (X / Y) * Y;
Но я тоже не знаю как на вашем ассемблере реализуются операции с плавающей точкой и как real преобразовать в integer (это делает Trunc - не округляет, а отсекает дробную часть)
Пишите лучше на псевдокоде, тогда больше людей смогут его понять.
NEW 16.05.15 14:15
Вот поэтому помощи и прошу. Хотя читаю очень много. Пытаюсь во все вникнуть, но как только открываю задания, сразу паника, спустя 2-4 дня абсолютного погружения без отдыха, что-то начинаю понимать. Но зверски тяжело. Просто тут много ребят пришли из гимназий специализированных, а я лишь обычный пользователь, чуть выше среднего. Я тут дорешиваю, можно потом скину на проверку с пояснениями? А то отдавать в среду надо, но очень хочется заранее исправить ошибки, если они есть (а они, я чувствую, у меня будут обязятельно((((( )
NEW 16.05.15 14:26
Да, и еще замечание по поводу операции вычисления остатка от деления 2-х целых 4-байтовых чисел mod(a,b).
Похоже, что в этом ассемблере есть операция
Похоже, что в этом ассемблере есть операция
div $t5,$t6 # Lo = $t5 / $t6 (integer quotient)
# Hi = $t5 mod $t6 (remainder)
которая его (remainder) и возвращает. Так что сложности вроде алгоритма
mod (a, b) = a kleiner b, dann a/ Wenn a groser b, dann mod (a-b, b)/
как Вы написали, вроде как не нужны.
NEW 16.05.15 14:39
в ответ lisenkalejka 16.05.15 14:28
Это было взято с сайта http://logos.cs.uic.edu/366/notes/mips%20quick%20tutorial.htm --
краткий обзор команд этого ассемблера.
краткий обзор команд этого ассемблера.
16.05.15 16:29
в ответ lisenkalejka 16.05.15 14:15
2-3 недели на язык, толком не разберешься а больше запутаешься.
Вот кстати ссыль на скрипт. Незнаю почему лежит в открытом доступе, но мне помог очень хорошо разобраться в ассемблере
www.mobile.ifi.uni-muenchen.de/studium_lehre/sose15/rechnerarchitektur/in...
Вот кстати ссыль на скрипт. Незнаю почему лежит в открытом доступе, но мне помог очень хорошо разобраться в ассемблере
www.mobile.ifi.uni-muenchen.de/studium_lehre/sose15/rechnerarchitektur/in...
NEW 16.05.15 16:32
в ответ Kvint 16.05.15 16:29
NEW 16.05.15 18:50
Nummer Name cs Bedeutung
$0 $zero — Hat beim Lesen immer den Wert 0
$1 $at — Wird vom Assembler verwendet; darf nicht vom Programmierer verwendet werden
$2–$3 $v0–$v1 nein Rückgabewerte eines Unterprogramms
$4–$7 $a0–$a3 nein Erste vier Argumente eines Unterprogramms
$8–$15 $t0–$t7 nein Temporäre Werte, Sichern durch Aufrufer
$16–$23 $s0–$s7 ja Temporäre Werte, Sichern durch Aufgerufenen
$24–$25 $t8–$t9 nein Temporäre Werte, Sichern durch Aufrufer
$26–$27 $k0–$k1 — Reserviert für das Betriebssystem
$28 $gp ja global pointer. Zeigt in die Mitte des ersten 64K Blockes im Datensegment
$29 $sp ja stack pointer. Kellerpegel
$30 $fp ja frame pointer. Schachtelzeiger
$31 $ra nein return address. Rücksprungadresse
A.3 Befehle
Art Opcode Operanden Bedeutung Kommentar
Arithmetik
addu $d $s t $d ← $s + $t
addiu $t $s i $t ← $s + sext32 16(i)
subu $d $s t $d ← $s − $t
Bitoperationen
and $d $s $t $d ← $s & $t
andi $d $s i $t ← $s & zext32 16(i)
or $d $s $t $d ← $s | $t
ori $d $s i $t ← $s | zext32 16(i)
xor $d $s $t $d ← $s ̂ $t
xori $d $s i $t ← $s ̂ zext32 16(i)
nor $d $s $t $d ← $s | $t
Shifts
sll $d $s n $d ← $s[31 − n ∶ 0] ⋅ 0n
srl $d $s n $d ← 0n ⋅ $s[31 ∶ n]
sra $d $s n $d ← ($s31)n ⋅ $s[31 ∶ n]
sllv $d $s $t $d ← s31−n … s0 ⋅ 0n
srlv $d $s $t $d ← 0t ⋅ s31 … st
srav $d $s $t $d ← st 31 ⋅ s31 … st
Vergleiche
slt $d $s $t $d ← if $s s< $t then 1 else 0
sltu $d $s $t $d ← if $s u<$t then 1 else 0
slti $d $s i $d ← if $s s<sext32 16(i) then 1 else 0
sltiu $d $s i $d ← if $s u< sext32 16(i) then 1 else 0
lui $d i $t ← i15 … i0 ⋅ 016
Laden
lw $d i($s) $d ← M[$s + sext32
16(i)] ($s + sext32
16(i)) & 3 = 0
lh $d i($s) $d ← sext32
16(M[$s + sext32
16(i)]) ($s + sext32
16(i)) & 1 = 0
lb $d i($s) $d ← sext32 8 (M[$s + sext32 16(i)])
lhu $d i($s) $d ← zext32 16(M[$s + sext32 16(i)]) ($s + sext32 16(i)) & 1 = 0
lbu $d i($s) $d ← zext32 8 (M[$s + sext32 16(i)])
Speichern
sw $d i($s) M[$s + sext32 16(i)] ← $d ($s + sext32 16(i)) & 3 = 0
sh $d i($s) M[$s + sext32 16(i)] ← $d[15 ∶ 0] ($s + sext32 16(i)) & 1 = 0
b $d i($s) M[$s + sext32 16(i)] ← $d[7 ∶ 0]
Sprung
beq $s $t offset pc ← pc + 4 + if $s = $t then sext32 16(offset) else 0
bne $s $t offset pc ← pc + 4 + if $s ≠ $t then sext32 16(offset) else 0
blez $t offset pc ← pc + 4 + if $t ≤ 0 then sext32 16(offset) else 0
bgtz $t offset pc ← pc + 4 + if $t > 0 then sext32 16(offset) else 0
bltz $t offset pc ← pc + 4 + if $t < 0 then sext32 16(offset) else 0
bgez $t offset pc ← pc + 4 + if $t ≥ 0 then sext32 16(offset) else 0
jal addr $31 ← pc + 8, pc ← addr
jr $s pc ← $s
syscall Rufe Betriebssystem
Pseudo
li $d i $d ← i
la $d l $d ← addr Lädt Adresse der Marke l
mul $d $s t $d ← $s × $t
div $d $s t $d ← $s/$t
not $d $s $d ← $s
neg $d $s $d ← −$s
b{lt, gt, le, ge} $d, $d, offset pc ← pc + 4 + if $s cmp $t then offset else 0
Это расшифровка...
$0 $zero — Hat beim Lesen immer den Wert 0
$1 $at — Wird vom Assembler verwendet; darf nicht vom Programmierer verwendet werden
$2–$3 $v0–$v1 nein Rückgabewerte eines Unterprogramms
$4–$7 $a0–$a3 nein Erste vier Argumente eines Unterprogramms
$8–$15 $t0–$t7 nein Temporäre Werte, Sichern durch Aufrufer
$16–$23 $s0–$s7 ja Temporäre Werte, Sichern durch Aufgerufenen
$24–$25 $t8–$t9 nein Temporäre Werte, Sichern durch Aufrufer
$26–$27 $k0–$k1 — Reserviert für das Betriebssystem
$28 $gp ja global pointer. Zeigt in die Mitte des ersten 64K Blockes im Datensegment
$29 $sp ja stack pointer. Kellerpegel
$30 $fp ja frame pointer. Schachtelzeiger
$31 $ra nein return address. Rücksprungadresse
A.3 Befehle
Art Opcode Operanden Bedeutung Kommentar
Arithmetik
addu $d $s t $d ← $s + $t
addiu $t $s i $t ← $s + sext32 16(i)
subu $d $s t $d ← $s − $t
Bitoperationen
and $d $s $t $d ← $s & $t
andi $d $s i $t ← $s & zext32 16(i)
or $d $s $t $d ← $s | $t
ori $d $s i $t ← $s | zext32 16(i)
xor $d $s $t $d ← $s ̂ $t
xori $d $s i $t ← $s ̂ zext32 16(i)
nor $d $s $t $d ← $s | $t
Shifts
sll $d $s n $d ← $s[31 − n ∶ 0] ⋅ 0n
srl $d $s n $d ← 0n ⋅ $s[31 ∶ n]
sra $d $s n $d ← ($s31)n ⋅ $s[31 ∶ n]
sllv $d $s $t $d ← s31−n … s0 ⋅ 0n
srlv $d $s $t $d ← 0t ⋅ s31 … st
srav $d $s $t $d ← st 31 ⋅ s31 … st
Vergleiche
slt $d $s $t $d ← if $s s< $t then 1 else 0
sltu $d $s $t $d ← if $s u<$t then 1 else 0
slti $d $s i $d ← if $s s<sext32 16(i) then 1 else 0
sltiu $d $s i $d ← if $s u< sext32 16(i) then 1 else 0
lui $d i $t ← i15 … i0 ⋅ 016
Laden
lw $d i($s) $d ← M[$s + sext32
16(i)] ($s + sext32
16(i)) & 3 = 0
lh $d i($s) $d ← sext32
16(M[$s + sext32
16(i)]) ($s + sext32
16(i)) & 1 = 0
lb $d i($s) $d ← sext32 8 (M[$s + sext32 16(i)])
lhu $d i($s) $d ← zext32 16(M[$s + sext32 16(i)]) ($s + sext32 16(i)) & 1 = 0
lbu $d i($s) $d ← zext32 8 (M[$s + sext32 16(i)])
Speichern
sw $d i($s) M[$s + sext32 16(i)] ← $d ($s + sext32 16(i)) & 3 = 0
sh $d i($s) M[$s + sext32 16(i)] ← $d[15 ∶ 0] ($s + sext32 16(i)) & 1 = 0
b $d i($s) M[$s + sext32 16(i)] ← $d[7 ∶ 0]
Sprung
beq $s $t offset pc ← pc + 4 + if $s = $t then sext32 16(offset) else 0
bne $s $t offset pc ← pc + 4 + if $s ≠ $t then sext32 16(offset) else 0
blez $t offset pc ← pc + 4 + if $t ≤ 0 then sext32 16(offset) else 0
bgtz $t offset pc ← pc + 4 + if $t > 0 then sext32 16(offset) else 0
bltz $t offset pc ← pc + 4 + if $t < 0 then sext32 16(offset) else 0
bgez $t offset pc ← pc + 4 + if $t ≥ 0 then sext32 16(offset) else 0
jal addr $31 ← pc + 8, pc ← addr
jr $s pc ← $s
syscall Rufe Betriebssystem
Pseudo
li $d i $d ← i
la $d l $d ← addr Lädt Adresse der Marke l
mul $d $s t $d ← $s × $t
div $d $s t $d ← $s/$t
not $d $s $d ← $s
neg $d $s $d ← −$s
b{lt, gt, le, ge} $d, $d, offset pc ← pc + 4 + if $s cmp $t then offset else 0
Это расшифровка...
NEW 16.05.15 19:12
в ответ lisenkalejka 16.05.15 18:50
NEW 16.05.15 19:16
в ответ lisenkalejka 16.05.15 19:12
мне кажется, что не хватает чего-то в 41 строке, и в самом конце...почему то считает по кругу, хотя если мод меньше, то должно выводить результат((( не знаю как записать, но не хватает 2 команд, а может еще где-то ошибка...не знаю...весь день бьюсь и не могу сделать, а без второго задания не сделаешь легкое третье и четвертое((( Помогите, пожалуйста, не осилю(((
NEW 16.05.15 22:45
в ответ lisenkalejka 16.05.15 22:19
Ok, следующий вопрос: Вы говорите, что прогрмма в start2 зацикливается. Как я понимаю, там должен быть цикл длиной в буфер, т.е. t1. Счетчик цикла, который не должен превысить t1 это t0, правильно?
Тогда проверьте значения t0, правильно ли оно было инициализировано и как оно увеличивается с каждым шагом цикла.
Тогда проверьте значения t0, правильно ли оно было инициализировано и как оно увеличивается с каждым шагом цикла.
NEW 18.05.15 16:10
в ответ lisenkalejka 18.05.15 12:24
А программа добирается до строчек 45-46 после того, как t0 становится больше t1?
Правильное ли в этот момент значение остатка (который мы собственно ищем) t2 (если я правильно понял, что остаток должен быть там)?
Если да, то куда программа перескакивает по по команде jr $ra?
Правильное ли в этот момент значение остатка (который мы собственно ищем) t2 (если я правильно понял, что остаток должен быть там)?
Если да, то куда программа перескакивает по по команде jr $ra?
NEW 18.05.15 16:40
Алгоритм записан по ссылке в Вашем документе http://de.wikipedia.org/wiki/IBAN#Validierung_der_Pr.C3.BCfsumme
Считываете весь IBAN, потом его начальный кусочек (буквенный код страны вроде DE и две следующие цифры) переносите в конец строки.
Далее 2 буквы заменяете на цифры по алгоритму: A - 10, B - 11, ... (например DE заменяется так на 1314).
Далее ищете остаток от деления этого длинного числа на 97 по записанной Вами уже подпрограмме. Вычитаете это значение из 98.
Вроде все.
Считываете весь IBAN, потом его начальный кусочек (буквенный код страны вроде DE и две следующие цифры) переносите в конец строки.
Далее 2 буквы заменяете на цифры по алгоритму: A - 10, B - 11, ... (например DE заменяется так на 1314).
Далее ищете остаток от деления этого длинного числа на 97 по записанной Вами уже подпрограмме. Вычитаете это значение из 98.
Вроде все.