2015-10-15 38 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'下面 –