String 每个字母的汇编语言字符串反转以及与原始字符串的比较
如何使用SI将字符串字母逐个反转,并将其与第一个字符串字母逐个进行比较?我原本想为循环将SI添加到Cl中,但发现它不允许我将SI添加到Cl中。任何建议都将不胜感激。这是我使用的代码,只是使用相同的字符串来测试比较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
.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]