MIPS:在右对齐列中对齐输出
MIPS: Aligning Output in Right Justified Columns
我正在学习 class 关于计算机如何在较低级别上运行的课程,目前主要是关于内存管理。其中一部分是使用 MIPS 处理器的 PCSPIM 模拟器学习用汇编语言编写。
我刚刚完成了关于循环的作业。为此,我不得不编写一个程序,提示用户输入一个数字并打印从 1 到该数字的数字。每 10 个字符打印一个换行符。假定输入为正。我做那部分没问题,程序运行正常。
然而,作为奖励,我被要求将输出对齐到右对齐列中。我很难过,我不知道该怎么做。我可以在 Java 中解决这个问题,但我才刚刚开始学习汇编的基础知识,在复习了到目前为止我在 class 中学到的所有内容后,我意识到我们根本没有学会如何做到这一点。我以前有过这位教授,她喜欢这样做让我们思考,看看我们是否能在没有她帮助的情况下解决问题。
我考虑过将所有结果放入一个数组并打印出来,但我不知道如何在 Assembly 中制作数组。我也考虑过使用 Assembly 的等价于 IF 语句,但每次向数字添加一个新数字并且没有允许输入的最大数字时,我都必须编写和测试一个。
如果有人能告诉我如何将我的输出打印到右对齐列中,我将不胜感激。到目前为止,这是我的代码:
###### Begin Text Section ######
.text
.globl __start
__start: # execution starts here
la $a0,prompt # load address of prompt into a0
li $v0,4 # load instruction number to display a string into v0
syscall # system call to print the prompt string
li $v0,5 # load call code number to read first integer -> v0
syscall # system call to read first integer and store in v0
move $t0,$v0 # move integer from v0 -> t0 for safe keeping
# t0 holds the Final Integer
addi $t1,1 # initialize t1 to 1
# t1 is the counter
addi $t2,1 # initialize t2 to 1
# t2 is the lineCounter
addi $t3,10 # initialize t3 to 10
# t3 is the Sentinel
la $a0,endl # load the new line character into a0
li $v0,4 # load the call code number to display the string into v0
syscall # system call to print the new line character
move $a0,$t1 # move t1 -> a0 for display
li $v0,1 # load call code number to display integer into v0
syscall # system call to print t1 as largest
la $a0,space # load address of prompt into a0
li $v0,4 # load instruction number to display a string into v0
syscall # system call to print the prompt string
WHILE: ble $t0,$t1,ENDWHILE # IF counter > final integer BREAK to ENDWHILE
add $t1,$t1,1 # increment counter
move $a0,$t1 # move t1 -> a0 for display
li $v0,1 # load call code number to display integer into v0
syscall # system call to print t1 as largest
la $a0,space # load address of prompt into a0
li $v0,4 # load instruction number to display a string into v0
syscall # system call to print the prompt string
add $t2,1 # increment lineCounter
beq $t2,$t3,NEWLINE # IF lineCounter = 10 BREAK to NEWLINE
j WHILE # go around the loop again
NEWLINE: la $a0,endl # display new line
li $v0,4
syscall
addi $t2,-10 # re-initialize t2 to 0
j WHILE # jump to WHILE
ENDWHILE: la $a0,endl # display new line
li $v0,4
syscall
li,$v0,10 #End Program
syscall
##### End Text Section #####
##### Begin Data Section ######
.data
prompt: .asciiz "Please enter a posetive integer: " # prompt for the Input
space: .asciiz " " # Space Character
endl: .asciiz "\n" # New Line Character
Example of output as the code is now:
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
...92 93 94 95 96 97 98 99 100
Example of how output should look:
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
... 92 93 94 95 96 97 98 99 100
所以任务是根据当前值和最终值的长度用 spaces 的数量填充输出。例如。用户输入 1234
,这意味着 1
应填充 3 个额外的 space,512
填充一个 space,1024
保持不变.
获取输入值的长度
从1开始,循环乘以10,直到结果大于输入值,同时计算循环迭代次数。迭代次数等于输入值的长度。让我们将其表示为 L.
找到必要的 spaces
好吧,天真的 straight-forward 方法是使用上面的方法获取当前值的长度,然后从 L 中减去它。但是,这是一种资源浪费,有一种更简单的方法。
你知道,你总是从 1
开始,所以最初你需要 L-1 个额外的 space。并且您知道每个“里程碑”数字,其中当前值的长度会增加。所以方法是这样的:
- 将
L-1
加载到负责跟踪额外spaces 数量的寄存器中
- 将
10
加载到负责跟踪里程碑的寄存器中
- 每次要打印数字时,请执行以下操作
- 如果数字等于里程碑,则递减额外 space 的计数器并将里程碑乘以 10。
- 打印 spaces
的存储数量
- 打印当前值
我正在学习 class 关于计算机如何在较低级别上运行的课程,目前主要是关于内存管理。其中一部分是使用 MIPS 处理器的 PCSPIM 模拟器学习用汇编语言编写。
我刚刚完成了关于循环的作业。为此,我不得不编写一个程序,提示用户输入一个数字并打印从 1 到该数字的数字。每 10 个字符打印一个换行符。假定输入为正。我做那部分没问题,程序运行正常。
然而,作为奖励,我被要求将输出对齐到右对齐列中。我很难过,我不知道该怎么做。我可以在 Java 中解决这个问题,但我才刚刚开始学习汇编的基础知识,在复习了到目前为止我在 class 中学到的所有内容后,我意识到我们根本没有学会如何做到这一点。我以前有过这位教授,她喜欢这样做让我们思考,看看我们是否能在没有她帮助的情况下解决问题。
我考虑过将所有结果放入一个数组并打印出来,但我不知道如何在 Assembly 中制作数组。我也考虑过使用 Assembly 的等价于 IF 语句,但每次向数字添加一个新数字并且没有允许输入的最大数字时,我都必须编写和测试一个。
如果有人能告诉我如何将我的输出打印到右对齐列中,我将不胜感激。到目前为止,这是我的代码:
###### Begin Text Section ######
.text
.globl __start
__start: # execution starts here
la $a0,prompt # load address of prompt into a0
li $v0,4 # load instruction number to display a string into v0
syscall # system call to print the prompt string
li $v0,5 # load call code number to read first integer -> v0
syscall # system call to read first integer and store in v0
move $t0,$v0 # move integer from v0 -> t0 for safe keeping
# t0 holds the Final Integer
addi $t1,1 # initialize t1 to 1
# t1 is the counter
addi $t2,1 # initialize t2 to 1
# t2 is the lineCounter
addi $t3,10 # initialize t3 to 10
# t3 is the Sentinel
la $a0,endl # load the new line character into a0
li $v0,4 # load the call code number to display the string into v0
syscall # system call to print the new line character
move $a0,$t1 # move t1 -> a0 for display
li $v0,1 # load call code number to display integer into v0
syscall # system call to print t1 as largest
la $a0,space # load address of prompt into a0
li $v0,4 # load instruction number to display a string into v0
syscall # system call to print the prompt string
WHILE: ble $t0,$t1,ENDWHILE # IF counter > final integer BREAK to ENDWHILE
add $t1,$t1,1 # increment counter
move $a0,$t1 # move t1 -> a0 for display
li $v0,1 # load call code number to display integer into v0
syscall # system call to print t1 as largest
la $a0,space # load address of prompt into a0
li $v0,4 # load instruction number to display a string into v0
syscall # system call to print the prompt string
add $t2,1 # increment lineCounter
beq $t2,$t3,NEWLINE # IF lineCounter = 10 BREAK to NEWLINE
j WHILE # go around the loop again
NEWLINE: la $a0,endl # display new line
li $v0,4
syscall
addi $t2,-10 # re-initialize t2 to 0
j WHILE # jump to WHILE
ENDWHILE: la $a0,endl # display new line
li $v0,4
syscall
li,$v0,10 #End Program
syscall
##### End Text Section #####
##### Begin Data Section ######
.data
prompt: .asciiz "Please enter a posetive integer: " # prompt for the Input
space: .asciiz " " # Space Character
endl: .asciiz "\n" # New Line Character
Example of output as the code is now:
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
...92 93 94 95 96 97 98 99 100
Example of how output should look:
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
... 92 93 94 95 96 97 98 99 100
所以任务是根据当前值和最终值的长度用 spaces 的数量填充输出。例如。用户输入 1234
,这意味着 1
应填充 3 个额外的 space,512
填充一个 space,1024
保持不变.
获取输入值的长度
从1开始,循环乘以10,直到结果大于输入值,同时计算循环迭代次数。迭代次数等于输入值的长度。让我们将其表示为 L.
找到必要的 spaces
好吧,天真的 straight-forward 方法是使用上面的方法获取当前值的长度,然后从 L 中减去它。但是,这是一种资源浪费,有一种更简单的方法。
你知道,你总是从 1
开始,所以最初你需要 L-1 个额外的 space。并且您知道每个“里程碑”数字,其中当前值的长度会增加。所以方法是这样的:
- 将
L-1
加载到负责跟踪额外spaces 数量的寄存器中
- 将
10
加载到负责跟踪里程碑的寄存器中 - 每次要打印数字时,请执行以下操作
- 如果数字等于里程碑,则递减额外 space 的计数器并将里程碑乘以 10。
- 打印 spaces 的存储数量
- 打印当前值