Speichern Sie die Byte-Anweisung in der RISC-V-Assembly

Ich habe einen kurzen Ausschnitt der RISC-V-Assembly, den ich nicht verstehe. Ich bin mir nicht sicher, ob ich die Anweisungen falsch interpretiere, nach meiner Interpretation scheint es, als ob die Verzweigung (BNE) genommen wird, aber es ist gegeben, dass es nicht sein sollte.

Gegebener kommentierter Code:

000001b8 <test_4>:
lui  sp,0xfffff     # -> load [sp]  = 0xfffff000
addi sp,sp,-96      # -> add -96 to [sp], resulting in [sp]  = 0xffffefa0 
sb   sp,2(ra)       # -> store 0xffffffff (sign extend [23:16] of [sp]) to memory
lh   a4,2(ra)       # -> load halfword from data memory to [a4]  = 0xffffffff 
lui  t2,0xfffff
addi t2,t2,-96      # -> [t2]  = 0xffffefa0 
li   gp,4 
bne  a4,t2,56c <fail> # -> guaranteed fail since 0xffffffff != 0xffffefa0? 

Jede Hilfe wäre sehr willkommen!

Entschuldigung, ich hatte das Gefühl, dass die von mir hinzugefügten Kommentare eine angemessene Erklärung dessen lieferten, was ich von jeder Anweisung erwartete. RISC-V ist relativ neu, teilt sich jedoch einen beträchtlichen Teil seines Befehlssatzes mit MIPS, das ziemlich alltäglich ist und in vielen College-Kursen gelehrt wird. Ich glaube, dass die Anweisungen LUI, ADDI, SB, BNE und SH alle in der MIPS ISA enthalten sind. Ich habe mich gefragt, ob ich speziell die Anweisungen SB (Store Byte) und LH (Load Halfword) richtig interpretiert habe. oder ob diese beiden Anweisungen den Wert 0xffffffff in den Speicher laden. Ich hoffe das ist besser!
Insbesondere hatte ich gehofft, jemand könnte sich die Kommentare für jede Anweisung ansehen und sehen, ob die Interpretation der Anweisungen falsch ist. Dieses Code-Snippet wurde für die RV32i-Basis-Integer-ISA zusammengestellt, falls das hilft. Wenn es weitere Informationen gibt, die ich bereitstellen kann, lassen Sie es mich einfach wissen
Warum sagen Sie "es ist gegeben, dass es nicht sein sollte"? Meine Lesung ist, dass das Befolgen des Zweigs als Fehlschlagen betrachtet wird und immer fehlschlagen wird.

Antworten (1)

Du scheinst falsch zu verstehen SB:

sb   sp,2(ra)       # -> store 0xffffffff (sign extend [23:16] of [sp]) to memory

Dieser Kommentar ist nicht korrekt. Dies speichert 0xa0 (untere 8 Bits von sp) im Speicher. Die Adresse ist ra+2.

a4 hat den Wert, 0xSSSSXXa0wo XXder Wert ist, der sich zufällig im nächsten Byte befindet, und SSSSist die Vorzeichenerweiterung davon. Wenn dieses Byte war, 0xefdann kann a4 tatsächlich den Wert haben 0xffffefa0.