Algorithm 在LC3中如何在汇编代码中生成排序算法
我有一个简单的循环,它接受一个名称并打印该名称而不保存它Algorithm 在LC3中如何在汇编代码中生成排序算法,algorithm,sorting,assembly,lc3,Algorithm,Sorting,Assembly,Lc3,我有一个简单的循环,它接受一个名称并打印该名称而不保存它 looptext getc ;starts text get loop for name ;since name isn't re-used, we don't have to save it add r1, r0, -10 ;Test for enter character brz finishloop1 ;if ente
looptext getc ;starts text get loop for name
;since name isn't re-used, we don't have to save it
add r1, r0, -10 ;Test for enter character
brz finishloop1 ;if enter, cancel the text loop
OUT ;If it's not enter, print out the character typed
br looptext ;Go back to loop
finishloop1
然后程序要求输入一个由空格分隔的ID号。所有这些值都保存到一个数组和每个循环中,它检查新输入是“新”最低值还是“新”最高值,并将其设置到相应的寄存器中
[为版权起见删除了代码]
在代码的末尾,我需要添加一个排序算法,只剩下一个字符数组
我需要检查数组的每个索引,并按照从最小到最大的数字顺序重新排列字符。非常感谢大家提供的提示和技巧。特别感谢@Ped7g将排序算法页面链接到我这里。最后我四处搜索,在gitub上找到了一个已经在汇编代码中编写了气泡算法的人。谢谢你间接地给了我答案 注意:对于任何未来来这里寻找答案的人,下面是气泡排序算法代码的链接: . 这是大学课程讲稿的一部分
; Implementing bubble sort algorithm
; R0 File item
; R1 File item
; R2 Work variable
; R3 File pointer
; R4 Outer loop counter
; R5 Inner loop counter
.ORIG x3000
; Count the number of items to be sorted and store the value in R7
AND R2, R2, #0 ; Initialize R2 <- 0 (counter)
LD R3, FILE ; Put file pointer into R3
COUNT LDR R0, R3, #0 ; Put next file item into R0
BRZ END_COUNT ; Loop until file item is 0
ADD R3, R3, #1 ; Increment file pointer
ADD R2, R2, #1 ; Increment counter
BRNZP COUNT ; Counter loop
END_COUNT ADD R4, R2, #0 ; Store total items in R4 (outer loop count)
BRZ SORTED ; Empty file
; Do the bubble sort
OUTERLOOP ADD R4, R4, #-1 ; loop n - 1 times
BRNZ SORTED ; Looping complete, exit
ADD R5, R4, #0 ; Initialize inner loop counter to outer
LD R3, FILE ; Set file pointer to beginning of file
INNERLOOP LDR R0, R3, #0 ; Get item at file pointer
LDR R1, R3, #1 ; Get next item
NOT R2, R1 ; Negate ...
ADD R2, R2, #1 ; ... next item
ADD R2, R0, R2 ; swap = item - next item
BRNZ SWAPPED ; Don't swap if in order (item <= next item)
STR R1, R3, #0 ; Perform ...
STR R0, R3, #1 ; ... swap
SWAPPED ADD R3, R3, #1 ; Increment file pointer
ADD R5, R5, #-1 ; Decrement inner loop counter
BRP INNERLOOP ; End of inner loop
BRNZP OUTERLOOP ; End of outer loop
SORTED HALT
FILE .FILL x3500 ; File location
.END
如果只允许1到9之间的数字,则按正确顺序,它们具有48+1到48+9之间的ASCII值。因此,如果将字符而不是数字存储到数组中,则可以对字符进行排序,并获得正确的顺序。然后可以将它们作为字符输出。保存ASCII字符串和数值之间从到的所有转换。这也适用于多位数,只要两个数字具有相同的字符串长度。对于不同的字符串长度,当您将额外的前导零添加到较短的一个时,字典比较将起作用。所以做一些1字符的排序。好的。。是的,我们只允许1到9次。我很抱歉我可能会这么做。去掉所有的转换,并将它们保留为字符。但“数字”排序的汇编算法是什么?从最小到最大?有很多。。。在汇编语言中编写它们与任何其他编程语言都非常相似,只需要更多的指令,因为您必须将从内存到内存的所有数据传输显式写入CPU寄存器,如果块经常需要比较,则看起来像LC3在使用加法,例如,您对enter的测试是add r1,r0,-10,然后在零为真时有条件跳转,根据检测到的条件有条件跳转和要执行/跳过的代码块。试着想象一下valuesBTW发生了什么事情。在汇编中,字符排序意味着仍然对数字进行排序,因为“1”是字节值49。。所以,只需对数组中的字节值进行排序,您的值将在49-57范围内,当用于某些ASCII输出时,这些值将显示为字符“1”到“9”的字体标志符号。所以在排序过程中,你们会想:49比54小吗?当yes/no.而不是1小于6时,执行此/那个操作。谢谢@Ped7g。通过你们的链接,我找到了一个已经在汇编中编写了气泡排序算法的人。