2015-10-15 68 views
1

我是新的彙編語言,我遇到了反轉字符串的問題。反轉裝配中的字符串(TASM)

例如:

原始字符串:「ABCD」
反轉之後:「DCBA」

我也希望把反向串入我使用了相同的變量名,而不是使用新的一個。 我想過使用堆棧和這裏的,我寫了一個代碼,但我想不通的地方是我的錯誤:

IDEAL 
MODEL small 
STACK 1000h 

DATASEG 

first db 'ABCD', 0 

CODESEG 

start: 
    mov ax, @data 
    mov ds, ax 
    mov si, 0 
    mov di, 0 

loop_start: 
    mov ax, [first+si] 
    inc si 
    test ax, ax 
    jz done1ax 

    push ax 
    jmp loop_start 

done1ax: 
     pop ax 
     mov [first+di], ax 
     inc di 
     cmp di, si 
     JL done1ax 

mov dl, 10 
mov ah, 2 
int 21h 
ret 

END start 
+3

字符串中的字符每個是一個字節。 'ax'寄存器是一個字寄存器(兩個字節)。 – Michael

+0

沒錯,但我在教程中看過,我不能將字符串定義爲'DW',另一方面,我不能使用'DB'變量來使用堆棧。那我該如何解決這個問題? – gil

+1

'push'和'pop'' ax'很好,但其他操作如'mov'和'test'需要使用像al'這樣的8位寄存器。 – Michael

回答

0

讓我解釋@邁克爾的評論:

IDEAL 
MODEL small 
STACK 1000h 

DATASEG 

first db 'ABCD', 0 

CODESEG 

start: 
    mov ax, @data 
    mov ds, ax 
    xor si, si    ; mov si, 0 
    xor di, di    ; mov di, 0 

loop_start: 
    mov al, [first+si] 
    inc si 
    test al, al 
    jz done1ax 

    push ax     ; pushes implicit `AL` 
    jmp loop_start 

done1ax: 
    pop ax     ; pops `AL` and `AH`, `AH` isn't used 
    mov [first+di], al 
    inc di 
    cmp di, si 
    jb done1ax    ; jl is signed comparison: 8000h < 7FFFh 

mov ah, 40h     ; WriteFile 
mov bx, 1     ; STDOUT 
mov cx, 4     ; Number of bytes to write 
mov dx, OFFSET first  ; Data to write 
int 21h 

mov ax, 4C00h    ; Return 0 
int 21h 

END start 
+0

即使解決了* AL與AX *問題,該程序也會崩潰,因爲它太多了!解決方案:將'inc si'放在'push ax'下面 –