2013-05-14 77 views
-1

我正在使用dosbox,這是一項任務。我必須使用堆棧來反轉字符串。我的想法是將字符串一個字符一次推入堆棧,然後逐個彈出到RevString中。我無法弄清楚如何實際做到這一點。這是我到目前爲止。使用堆棧反轉字符串

.MODEL SMALL 
.STACK 100h 

.DATA 

String  DB "NAJAFI", 13, 10, "$" 
RevString DB 6 DUP(?), '.', 13, 10, "$" 

.CODE 

Main PROC 

    ;; Set up ds register to point to the data 
    mov ax, @data 
    mov ds, ax 

    ;; printing a string in dos 
    mov dx, OFFSET String 
    mov ah, 9h 
    int 21h 

    ;; reverse the string by using the stack 
    mov ax, WORD PTR String 
    push ax 
    pop ax 
    ;mov RevString, ax 


    ;; print the reverse string in dos 
    mov dx, RevString 
    mov ah, 9h 
    int 21h 

    ;; DOS return 
    mov al, 0 
    mov ah, 4ch 
    int 21h 

Main ENDP 
END Main 
+1

提示:你需要一個循環。 –

+0

我很好,手動選擇索引,因此我不需要一個循環正確?如果是這樣的話,實際推送的語法是什麼?將字母「N」寫入堆棧? –

+0

你需要一個循環。如果你以任何其他方式進行,你會將你的代碼綁定到特定的字符串長度,並得到一個不好的成績。 :) –

回答

1

要推一根繩子到堆棧中:

mov di, offset String 
    mov cx, string_length 
    xor ax, ax 
pushloop: 
    mov al, [di] 
    push ax 
    inc di 
    dec cx 
    jnz pushloop 

你可以做同樣類型的事情,從棧中彈出的字符爲RevString

+0

謝謝你向我展示如何做到這一點。你是否願意展示如何從類似的循環中彈出堆棧? –

+0

@ user45763:膨化回來是很相似的:從棧中彈出,保存字符。循環直到完成。 –

-2

你不扭轉字符串,堆棧會爲你

串DB 「納傑菲」

推像:

我< ---第一個彈出

˚F

Ĵ

一個

ň< - 第一個推:堆棧指針+ 2(或4)

所以,當你的流行你只需直接彈出到打印功能和它的逆轉。

魔法!

0

對於80x86,堆棧以2字節,4字節或8字節邊界對齊(2字節對齊爲16位)。如果你推一個字節,CPU將自動添加填充以確保對齊。

爲了解決這個問題,您可以改爲使用單詞。例如:

lodsw  ;ax = next pair of bytes 
rol ax,8 ;Swap the bytes 
push ax ;Store the bytes 

這樣做的問題是,檢測和處理「的字符串的末尾」變得雜亂,因爲(在你的情況下)$字符可以在ALAH(取決於串是否有結束奇數或偶數個字符)。

當然有幾種選擇。第一種方法是將填充的反轉字符串存儲在堆棧中,然後在刪除填充的同時將其複製到其他位置。

另一種方法是保留在堆棧上足夠的空間(例如,從SP減去的值),然後通過使用正常MOV指令(不使用PUSH)創建在你所保留的空間中的反轉字符串。

0

你的字符串處理也是,如果你不知道怎麼回事

創建一個有界數據塊讓一切變得簡單和動態

.start 
db "NAJAFI" 
.end 

mov edx,end-start ;a nice and simple string length 
mov ebx,start  ;a nice and simple string start point 
mov ecx,0 

.loadstack 
mov eax,[ebx] 
push eax 
inc ecx 
cmp ecx,edx 
jz printsetup 
inc ebx 
jmp loadstack 

.printsetup 
mov ecx,0 

.printstackbackwards 
pop eax 
[PRINT IT OUT BIT] 
inc ecx 
cmp ecx,edx 
jnz printstackbackwards 

end 
0

因爲我想給它一個嘗試太複雜,這是我的版本。我在想這是否可以優化。

;********************************************** 
; 
; Reverse a string using the stack. 
; EAX is the pointer to the C string. 
ReverseWithStack proc 


    mov esi, eax 
    mov edi, eax 

_push_loop: 
    mov al, [esi] 
    cmp al, 0 
    jz _pop_loop 

    push ax 
    inc esi 
    jmp _push_loop 

_pop_loop: 
    mov al, [edi] 
    cmp al, 0 
    jz _done 

    pop ax 
    mov [edi], al 
    inc edi 
    jmp _push_loop 

_done: 

    ret 

ReverseWithStack ENDP 
0

據我所知,你不能推棧上的字節,只有單詞和雙字。 這裏有一個想法: 你有串, 使用過程計算字符串長度, 推棧上的字符串, 字符串的長度-1添加到EBP(也就是說,如果直接在上面EBP u有串否則因此操縱它), 現在,這將指向字符串的結尾。現在,您可以使用EBP獲取最後一個字符,然後遞減1,並繼續逐字符。