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。通过你们的链接,我找到了一个已经在汇编中编写了气泡排序算法的人。