Вход на сайт
Дайте направление решения задачи.
NEW 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 --
краткий обзор команд этого ассемблера.
краткий обзор команд этого ассемблера.
NEW 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