【问题标题】:Assembly language string reversal per letter and comparison with original string每个字母的汇编语言字符串反转并与原始字符串进行比较
【发布时间】:2016-03-21 08:35:06
【问题描述】:

如何逐个字母反转字符串并使用 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

【问题讨论】:

  • 抱歉,您的代码太长而且结构太混乱,我无法阅读,具体有什么问题?一般来说,从输入中读取字符串后,获取其大小 S 并将字母从 S-1th 复制到第 0 个新缓冲区。
  • 基本上,我唯一缺少的是让第二列与第一列或字符串相反。 :)
  • 请参阅stackoverflow.com/questions/15415838/palindrome-using-nasm/…,了解 x86 asm 中的几个高效回文检查功能。

标签: string assembly x86


【解决方案1】:

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

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

既然你已经得到了 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

【讨论】:

  • 使用 alah 将阻止这些负载在 AMD CPU 上并行运行。您可以只使用内存操作数 cmp。 (您确实提出了与我在编写一些有效回文循环时相同的 inc 指针和 index-=2:stackoverflow.com/questions/15415838/palindrome-using-nasm/…
  • aldl 将是不错的选择,如果您不想使用 cmp al, [di+bx]
猜你喜欢
  • 2014-05-06
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
相关资源
最近更新 更多