每个字母的汇编语言字符串反转以及与原始字符串

时间:2016-03-21 08:35:06

标签: string assembly x86

如何逐个字母地反转字符串,并使用SI将其与第一个字母串逐字母进行比较?我最初考虑过为循环添加SI到Cl,但发现它不会让我将SI添加到Cl。任何建议将不胜感激。这是我使用的代码,只是使用相同的字符串来测试比较。

    .model small
    .stack 100h
    .data
    input db 'Input string: $'
    display db 10,10,13,'String is $'
    length db 10,10,13,'String length is $'
    character db 10,10,13,'Characters are:$'
    equaldata db  'Equal$'
    notequaldata db  'Not Equal$'
    string db 20 dup('$')
    .code
    mov ax, @data
    mov ds, ax

    lea si, string

    mov ah, 09h
    mov dx, offset input
int 21h

mov ah, 0Ah         ;request to input string
lea dx, string
int 21h

mov ah, 09h
mov dx, offset display
int 21h

lea dx, string + 2
int 21h

mov ah, 09h
mov dx, offset length
int 21h

mov bl, string + 1  ;length of string

mov ax, 0
mov al, bl          ;length in hexadecimal
aam                 ;length in decimal

mov ch, ah          ;tens digit of length
mov cl, al          ;ones digit of length

mov ah, 02h
add ch, 30h
mov dl, ch          ;display tens digit of length
int 21h

add cl, 30h
mov dl, cl          ;display ones digit of length
int 21h

mov ah, 09h
mov dx, offset character
int 21h

    mov cx, 0
    mov cl, bl          ;counter for loop
    mov dh, cl
    print_character:
    mov bh, si + 2

    mov ah, 02h
    mov dl, 0Ah     ;newline
    int 21h

    mov dl, 0Dh     ;carriage return
    int 21h

    mov dl, bh      ;character of string
    int 21h 

    mov dl, 20h     ;spaces
    int 21h
    int 21h
    int 21h
    int 21h

    ;----------------------second letter--------------        
    mov bl, si + 2
    mov dl, bl
    int 21h



    mov dl, 20h
    int 21h
    int 21h
    int 21h
    int 21h


    ;---------------------equal or not equal-----------        
    cmp bh, bl
    je equal
    jne notequal

    equal:
    mov ah, 09h
    mov dx, offset equaldata        ;display equal data
    int 21h
    jmp lineend

    notequal:
    mov ah, 09h
    mov dx, offset notequaldata     ;display not equal
    int 21h     
    jmp lineend 

    lineend:
    inc si
    dec dh
    loop print_character 





    int 20h
    end

1 个答案:

答案 0 :(得分:1)

  

逐个字母地反转一个字符串,并将其与第一个字母逐个字母进行比较

这是非常无用的,因为只有在回文的情况下,比较才会导致平等。对回文的测试根本不需要反转!使用2个指针,一个在字符串的开头,一个在字符串的末尾。停在第一个不平等。如果你到达中间,你知道这个字符串是回文。

由于您在BL中获得了字符串长度,因此将为循环设置此代码:

app.use(require('./routes/user'));

在您当前的代码中,由于您比较相同的内存内容,因此不可避免地会获得相等性。

mov bh, 0
dec bx
lea di, [si+2]

Again:
 mov al, [di]     ;Character from the front of the string
 mov ah, [di+bx]  ;Character from the rear of the string
 cmp al, ah
 ...
 inc di
 sub bx, 2
 jnbe Again
IsPalindrome: