MIPS - Знак Расширение 8-разрядного регистра 2SC до 32-разрядного 2SC - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь написать программу, которая принимает два 8-битных аргумента программы 2SC, либо в виде двоичных файлов (например, 0b10000000), либо шестнадцатеричных (например, 0x80), а затем знак расширяет их до 32 бит.

Вот инструкции, которые у меня есть на данный момент:

.data

output1: .asciiz "The value of $s1 is:\n"
output2: .asciiz "\nThe value of $s2 is:\n"

.text

lw $s1, ($a1)                # grab first program argument, set to $s1
lw $s2, 4($a1)               # grab second argument, set to $s2

lb $t0, 1($s1)               # store second character of $s1 in $t0
beq $t0, 'b', extends1       # if $t0 = b, branch to extends1
beq $t0, 'x', extends1       # if $t0 = x, branch to extends1

lb $t0, 1($s2)               # store second character of $s2 in $t0
beq $t0, 'b', extends2       # if $t0 = b, branch to extends2
beq $t0, 'x', extends2       # if $t0 = x, branch to extends2

extends1:
    sll $s1, $s1, 24         # logical left shift 24 bits
    sra $s1, $s1, 24         # arithmetic right shift by 24 bits

extends2:
    sll $s2, $s2, 24         # logical left shift 24 bits
    sra $s2, $s2, 24         # arithmetic right shift by 24 bits

li $v0, 4
la $a0, output1
syscall                      # print "The value of $s1 is:\n"
li $v0, 34
move $a0, $s1
syscall                      # print the contents of $s1
li $v0, 4
la $a0, output2
syscall                      # print "\nThe value of $s2 is:\n"
li $v0, 34
move $a0, $s2
syscall                      # print the contents of $s2

Однако, похоже, это работает не так, как ожидалось.При наборе аргументов программы: «0x80 0xFF» системные вызовы в конце программы выдают следующее:

The value of $s1 is:
0xfffffff8
The value of $s2 is:
0xfffffff3

Однако правильные результаты должны быть:

The value of $s1 is:
0xffffff80
The value of $s2 is:
0xffffffff

Кто-нибудь имеет представление о том, что здесь происходит не так?Большое спасибо заранее.

...