我正在编写一个基于LC-3汇编语言的.asm程序,它将遍历一个字符串列表,反转每个字符串,然后将它存回到它的位置。名单。
例如:
STRINGS .STRINGZ "aabbb"
"bbcva"
"abcde"
该计划会将该列表翻转为" bbbaa
"," avcbb
"和" edcba
&# 34; - 因此,反转字符串但保持列表排序。
我目前正在研究一个嵌套循环的想法,其中外部循环将从一个字符串变为另一个字符串,内部循环将翻转它们并且它踢我的屁股!我用Java编写代码来做同样的事情,花了我5分钟,但由于某种原因,汇编只是在我的大脑上。关于如何做到这一点的任何指示?
这是我到目前为止所做的,在假装和装配的混合中:
.ORIG x3000
LEA R0, STRINGS ; Load the address of the first char of the list of strings
Loop until NOP is found, signaling end of the string.
LEA R1, the address above ; stores the address of the last char
LDR R2, #0 Offset +1 ; load the first char to be flipped
LDR R3, #0 Offset +2 ; load the last char to be flipped
STR R3, #0 Offset +1 ; store the last char in the mem addr of the first
STR R2, #0 Offset +2 ; store the first char in the addr of the last
ADD R1, R1 + 1 ; increment the addr of the first char to move to the second
ADD R2, R2 - 1 ; decrement the addr of the last char the move the second-to-last
loop back to beginning somehow
我一点也不知道如何在字符串之间进行外循环。
TL; DR - 汇编程序在内存中反转一个字符串,请帮忙。
答案 0 :(得分:0)
也许你应该编写内部循环,转到字符串的一半并交换字符? 我从一开头的那个地方从最后的地方开始? 结束NUL保持原样。 如果字符数是奇数,则中间字符保持不变。 如果将字符串长度除以2(向右移一位),您将获得要循环的字符数。 提醒是0或1(其中多余的一个id是奇数个字符串的中间字符)。 所以你交换str [i]和str [last-i](通过一个临时商店),其中' last'是字符串长度 - 1。 通常在汇编中,它更容易向后循环:从len / 2开始并递减直到索引为零(条件跳转到循环开始的结束条件)。