2014-03-27 3 views
0

LC-3 어셈블리 언어를 기반으로하는 .asm 프로그램을 작성하는 중입니다. 문자열 목록을 반복하고 각 문자열을 역순으로 목록에 다시 저장합니다 . 예를 들어문자열 반전 LC3 어셈블리 언어

:이 프로그램은이 목록을 뒤집어 것

 STRINGS .STRINGZ "aabbb" 
         "bbcva" 
         "abcde" 

에 "bbbaa", "avcbb"및 "edcba"- 따라서, 문자열을 반대하지만,리스트의 순서를 유지.

현재 외부 루프가 문자열에서 문자열로 이동하고 내부 루프가이를 뒤집어서 내 엉덩이를 걷어차는 중첩 루프 아이디어를 만들고 있습니다! 나는 자바에서 코드를 작성하여 동일한 작업을 수행했으며 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

어쩌면 문자열의 절반으로 이동하고 문자를 바꿔주는 내부 루프를 작성해야할까요? 처음부터 i 장소의 끝과 i 장소를위한 것? 끝 NUL은 그대로 둔다. 문자 수가 홀수 인 경우 중간 문자는 그대로 유지됩니다. 문자열 길이를 2로 나누면 (오른쪽으로 1 비트 시프트 함) 반복 ​​할 문자 수를 얻습니다. 미리 알림은 0 또는 1입니다 (이 경우 초과 된 ID는 홀수 문자 열의 중간 문자입니다). 그래서 str [i]와 str [last-i]를 (임시 저장소를 통해) 교환합니다. 여기서 'last'는 문자열 길이 - 1입니다. 어셈블리에서 자주 뒤로 루프하는 것이 더 쉽습니다. len/2로 시작하고 감소시킵니다. 인덱스가 0이 될 때까지 (조건부 점프와 루프 시작점의 종료 조건).