Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly MIPS-将数字转换为十六进制_Assembly_Mips - Fatal编程技术网

Assembly MIPS-将数字转换为十六进制

Assembly MIPS-将数字转换为十六进制,assembly,mips,Assembly,Mips,所以我在做一个汇编编程作业,老师让我们在数组中输入5个数字(它们必须大于0小于65536),然后把它们取出来,转换成十六进制,然后打印出来。他给出了转换为十六进制的方法,如下所示: (1) 对值15和参数执行逻辑AND (2) 如果结果小于10,则将其添加到字符“0”的ASCII代码中。否则,减去它 然后将其添加到字符“A”的ASCII代码中 (3) 将参数右移四位 (4) 重复上述过程四次 (5) 取上述四个结果中最低的8位,将它们合并为一个 登记并返回 我想我已经正确地完成了步骤1-4,但我

所以我在做一个汇编编程作业,老师让我们在数组中输入5个数字(它们必须大于0小于65536),然后把它们取出来,转换成十六进制,然后打印出来。他给出了转换为十六进制的方法,如下所示:

(1) 对值15和参数执行逻辑AND

(2) 如果结果小于10,则将其添加到字符“0”的ASCII代码中。否则,减去它 然后将其添加到字符“A”的ASCII代码中

(3) 将参数右移四位

(4) 重复上述过程四次

(5) 取上述四个结果中最低的8位,将它们合并为一个 登记并返回

我想我已经正确地完成了步骤1-4,但我不完全理解步骤5,有人能帮我弄清楚该怎么做吗?他所说的“四个结果中最低的8位”是什么意思?我在下面包含了我的代码(它完成了步骤4之前的所有工作,但是我没有为步骤5编写代码,因为我不理解它)

# MIPS Programming Assignment 3

.data
    msg: .asciiz "\nPlease enter an integer: " #input prompt
    error: .asciiz "\nYour number is out of range, try again!"
    array: .space 20            #reserve space for 5-integer array
.text
main:
la $t3, array #load pointer for traversing array
la $s0, array #load initial position of array

#initialize counter for loop
add $t0, $t0, $zero #set counter to 0
li $t1, 5 #set maximum number of passes to 5

#initialize counter for hexadecimal loop
add $t4, $t4, $zero #set counter to 0
la $t5, array #load pointer for traversing array

#loop to insert numbers into array
insert_loop:
    beq $t0, $t1, hexadecimal_loop #if $t0 = $t1 then exit loop
    li $v0, 4 #system call code for printing string
    la $a0, msg
    syscall
    li $v0, 5 #system call for reading integer
    syscall
    move $t2, $v0 #move read integer to $t2
    bltz $t2, error_msg #bltz = branch if ($t2) < zero
    bgt  $t2, 32768, error_msg #branch if t2 > 32768
    sw $t2, ($t3) #stores t2 in t3 array
    addi $t3, $t3, 4 #increment array by 4 (move to next index)
    addi $t0, $t0, 1 #increment counter by 1
    j insert_loop

#loop for hexadecimal subprogram
hexadecimal_loop:
    add $s2, $s2, $zero  #set counter for loop
    li $s3, 5 #set max number of passes to 5
    beq $t4, $t1, exit #when $t4 = $t1, then exit loop
    lw $s1, ($t5) #store array value into $s1
    add $a0, $zero, $s1  #"move" value to $a0 to use as parameter
    jal hexadecimal
    addi $t5, $t5, 4 #increment array by 4 (move to next index)

#hexadecimal subprogram
hexadecimal:
    add $t5, $a0, $zero #copy parameter to $t5
    beq $s2, $s3, return_result #when $s2 = $s3 then exit loop
    andi $t6, $t5, 15 #logical AND on $t5 and 15
    addi $t7, $t7, 10 #variable to check again
    bgt $t6, $t7, more_than_ten #if $t6 > 10
    blt $t6, $t7, less_than_ten #if $t6 < 10
    addi $s2, $s2, 1 #increment counter by 1

#error message display
error_msg:
    li $v0, 4
    la $a0, error
    syscall
    j insert_loop
less_than_ten:
    addi $t7, $t6, 10
    srl $t5, $t5, 4
    j hexadecimal
more_than_ten:
    addi $t7, $t6, -10
    addi $t7, $t7, 65
    srl $t5, $t5, 4
    j hexadecimal
exit:
    li $v0, 10   # System call code for exiting program
    syscall
#MIPS编程作业3
.数据
msg:.asciiz“\n请输入一个整数:”#输入提示
错误:.asciiz“\n您的号码超出范围,请重试!”
数组:。空间20#为5整数数组保留空间
.文本
主要内容:
la$t3,数组#用于遍历数组的加载指针
la$s0,阵列#加载阵列的初始位置
#为循环初始化计数器
添加$t0、$t0、$0#将计数器设置为0
li$t1,5#将最大通过次数设置为5
#初始化十六进制循环的计数器
添加$t4、$t4、$零#将计数器设置为0
la$t5,数组#用于遍历数组的加载指针
#循环将数字插入数组
插入\u循环:
beq$t0,$t1,十六进制循环#如果$t0=$t1,则退出循环
li$v0,4#用于打印字符串的系统调用代码
洛杉矶$a0,味精
系统调用
li$v0,5#读取整数的系统调用
系统调用
移动$t2,$v0#将读取整数移动到$t2
bltz$t2,如果($t2)<0,则错误_msg 35; bltz=分支
bgt$t2,32768,错误消息#如果t2>32768则分支
sw$t2,($t3)#将t2存储在t3阵列中
addi$t3,$t3,4#将数组增加4(移动到下一个索引)
addi$t0,$t0,1#递增计数器1
j插入u环
#十六进制子程序的循环
十六进制循环:
添加$s2、$s2、$零#为循环设置计数器
li$s3,5#将最大传球次数设置为5
beq$t4,$t1,退出#当$t4=$t1时,退出循环
lw$s1,($t5)#将数组值存储到$s1中
将$a0、$零、$s1#“移动”值添加到$a0以用作参数
日航十六进制
addi$t5,$t5,4#将数组增加4(移动到下一个索引)
#十六进制子程序
十六进制:
添加$t5、$a0、$零#将参数复制到$t5
beq$s2,$s3,返回_结果#当$s2=$s3时,退出循环
andi$t6、$t5、15#逻辑AND在$t5和15上
要再次检查的addi$t7、$t7、10#变量
bgt$t6,$t7,如果$t6>10,则超过10
blt$t6,$t7,如果$t6<10,则少于10
addi$s2,$s2,1#递增计数器1
#错误信息显示
错误消息:
李$v0,4
la$a0,错误
系统调用
j插入u环
少于十个:
附加$t7、$t6、10
srl$t5,$t5,4
十六进制
十有八九:
addi$t7、$t6、-10
附加$t7、$t7、65
srl$t5,$t5,4
十六进制
出口:
li$v0,10#退出程序的系统调用代码
系统调用

您要转换的数字小于65536,因此它将适合16位。即4个十六进制数字。每个十六进制数字可以表示为一个ASCII字符,该字符适合一个字节(8位),因此您可以在单个32位寄存器中获得所有四个数字的ASCII表示

算法的第2步和第3步在用于计算的寄存器的低位字节中提供一个ASCII字符。这个低位字节是您的老师所说的“最低8位”

您需要将此低位字节存储在某个寄存器中(调用者在返回时将查看的寄存器)。但是,由于重复步骤2和3,您需要确保存储方式不会导致它被进一步的迭代覆盖

一种可能性是:

  • 开始之前,将存储寄存器设置为零
  • 每次完成算法的第2步时
    • 将存储寄存器向左移位8位
    • 将ASCII值(一个字节)添加到寄存器
  • 具体来说,类似这样的情况:

  • 存储寄存器Rx:0x00000000
  • 第一次通过算法步骤2
    • 左移Rx给出0x00000000
    • 将ASCII值(例如“A”=十六进制29)添加到0x00000029
  • 第二次通过算法步骤2
    • 左移Rx给出0x00002900
    • 将ASCII值(例如“1”=十六进制1F)添加到0x0000291F
  • 第三次通过算法步骤2
    • 左移位Rx给出0x00291F00
    • 将ASCII值(例如“7”=十六进制25)添加到0x00291F25
  • 第四次通过算法步骤2
    • 左移Rx给出0x291F2500
    • 将ASCII值(例如“2”=十六进制20)添加到0x291F2520
  • 完成后,寄存器(Rx)应包含4个ASCII字符“A”、“1”、“7”和“2”(可能按相反顺序,取决于您想对它们执行的操作)。调用函数可以在Rx中查找,例如,将它们打印出来。

    在Craig的答案中有工作int->十六进制字符串代码。