2016-06-24 16 views
0

ich einen Code in IAS Montage implementieren, um dieses Problem zu lösen:Montag Logarithmus Basis 2

Ich habe ein Array von ganzen Zahlen A=[a1,a2,...,an] und ich habe B=[|log2 a1|,|log2 a2|,...,|log2 an|] zu berechnen, wo || die Bodenfunktion ist, die die abrundet nächste ganze Zahl.

Ich versuche, die folgenden Schritte zu implementieren:

  1. erstellen zuerst die |log2 x| und stellen Sie sicher, dass es für eine positive ganze Zahl funktioniert
  2. Lauf 1) in jeder Reihe des Arrays A das Array zu berechnen B

ich schrieb dies, aber es funktioniert nicht:

loop: S(x)->Ac+ n ;load n in AC 
     Cc->S(x) log ;if AC >= 0 jump to log 
     halt   ; else end the program 
     .empty 

log: S(x)->R resm ;copy number 2 to AR 
     S(x)*R->A two ;multiply 2*2 
     At->S(x) resm ;save in resm 
     S(x)->Ah+ one ;+1 counter 
     At->S(x) cont ;save the counter 
     S(x)->Ac+ n ;load n in AC 
     S(x)->Ah- one;decrease n in 1 
     At->S(x) n ;save n 
     Cu->S(x) loop; jump to beggining to make all again 

    n: .data 4 ;number to calculate log 
    two: .data 2 ;base of the logarithm 
    one: .data 1 ;for increase the counter 
    resm: .data 2 ;for save the result of the multiplication 
    cont: .data 0 ;save the result of the logarithm 

IAS ist eine unterrichtende Unterrichtssprache, implementiert in a simulator. Diese Seite dokumentiert auch den Befehlssatz.

+0

Sie müssen beschreiben, * wie * es nicht funktioniert, d. H. Was passiert, wenn Sie es ausführen und was Sie mit einem Debugger herausgefunden haben. Die Frage muss beantwortbar sein, ohne dass Sie Ihren Code ausführen müssen. Sehen Sie diese Erklärung des Erstellens eines [mcve] –

+0

oh, gut, ich weiß nicht, wie ich mein Problem lösen kann, weil ich nicht sehr gut verstehe, wie man in Assembler auch in diesem Simulator programmiert, wenn ich meinen Code zusammenstelle, zeigt der Simulator einen Fehler, "ERROR : Etiketten können nur mit Anweisungen in der linken Hälfte eines Wortes bei Zeile: 20 und Spalte: 0 " – Ravield

+0

verwendet werden. Und Zeile 20 ist die' cont: .data 0' Zeile? Sie sollten eine Änderung vornehmen, um sie in Ihrer Frage zu markieren. Ich musste deinen Code-Block in 'cat -n' einfügen, um Zeilennummern zu erhalten. –

Antwort

0

Da der Befehlssatz keinen lzcnt/bsr-Befehlstyp zu do this without looping hat, würde der normale Weg darin bestehen, zu zählen, wie viele Rechtsverschiebungen erforderlich sind, um alle Bits zu verschieben.

floor(log2(x)) ist das gleiche wie die Position des höchstwertigen Bit zu finden:

z.B. floor(log2(17)) = floor(log2(16)) = 4 und floor(log2(15)) = 3.
17 und 16 haben beide 5 Binärziffern, aber 15 ist nur 0b1111 (4 Binärziffern).

Da log2(0) -Infinity ist, ist die Funktion nicht gut definiert, wenn der Eingang Null ist. Selbst x86's bsr instruction lässt das Ergebnis in diesem Fall leider undefiniert.

Ich denke, Sie versuchen, eine Schleife zu loeschen, indem Sie eine 1 verlassen, bis es größer als oder gleich x ist, basierend auf der Multiplikation von two. Das wird funktionieren. (Eine Linksverschiebung ist eine Multiplikation mit 2).

Ihr Kommentar sagt etwas über 2 * 2, was seltsam ist.

Ich kenne IAS nicht, und Sie haben nichts darüber gesagt, wie Ihr Code nicht funktioniert. Dieser Teil der Frage liegt also immer noch bei Ihnen, bis Sie die Frage aktualisieren, um etwas Spezifisches zu einer Anweisung zu machen, die nicht das tut, was Sie erwarten, oder so.