Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 每个字母的汇编语言字符串反转以及与原始字符串的比较_String_Assembly_X86 - Fatal编程技术网

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

String 每个字母的汇编语言字符串反转以及与原始字符串的比较,string,assembly,x86,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

如何使用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
逐个字母反转字符串,并将其与第一个字符串字母逐个进行比较

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

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

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:

在当前代码中,由于比较相同的内存内容,因此不可避免地会得到相等的结果

print_character:
 mov bh, si + 2

 ...

 ;----------------------second letter--------------        
 mov bl, si + 2

 ...

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

抱歉,您的代码太长,太无结构,我无法阅读,具体有什么问题?通常,从输入读取字符串后,取其大小
S
,然后将字母从
S-1
th复制到第0个新的缓冲区中。基本上,我唯一缺少的是第2列与第一列或字符串相反。:)有关x86 asm中的两个高效回文检查函数,请参阅。使用
al
ah
将阻止这些加载在AMD CPU上并行运行。您可以使用内存操作数
cmp
。(你确实提出了与我写一些有效回文循环时相同的
inc
指针和索引-=2:)@PeterCordes我使用
AL
AH
来实现OP的好处。
AL
dl
是很好的选择,如果你不想使用
cmp AL,[di+bx]