Необходимо удалить все не буквенные элементы из строки в сборке - PullRequest
0 голосов
/ 30 октября 2019

с написанием этого ассемблера я не могу заставить эту опцию работать с удалением не символьной буквы. он будет либо перебирать строку со всеми сравнениями, а затем отображать ту же строку без удаленных символов. Я пытаюсь получить буквенные символы в tempString, которые затем можно переместить в edx для отображения.

он принимает строку и удаляет все не буквенные символы
, затем отображает новую строку, используя другуюпроцедура, которая использует Writestring и регистр edx


;// ------------------------------------------------------------------------------
option3 PROC
;// Description: removes all non-letter elements. There is no requirement for
;// option2 to have been executed.
;// Receives: ecx - length of string
;// edx - offset of string
;// ebx - offset of string length variable
;// esi preserved
;// Returns: nothing, but the string will have all non-letter elements removed

.data


.code

push esi
call option5

L3:
mov al, byte ptr [edx+esi]

cmp al, 41h
jb notletter
cmp al, 5Ah
ja notletter
cmp al, 61h
jb notletter
cmp al,7Ah
ja notletter


mov byte ptr [edx+esi], al

notletter:
inc esi
loop L3


pop esi
call option5
call waitmsg

option3 ENDP

1 Ответ

2 голосов
/ 30 октября 2019

Во-первых, думайте об этом как о копировании из одного места в одно и то же место;где байты, которые нужно игнорировать, не копируются. Для этого вам нужно 2 регистра - один для отслеживания того, где взять следующий байт (например, может быть esi), и один для отслеживания того, где хранить следующий байт / букву (например, edi).

Во-вторых, ваши ветки "это ли буква" не верны (например, буква 'A' или значение 0x41 будет меньше, чем буква 'a' или значение 0x61). Это должно быть больше похоже на:

    cmp al,'A'       ;Is the value too low to be any letter?
    jb .notLetter    ; yes
    cmp al,'z'       ;Is the value too high to be any letter?
    ja .notLetter    ; yes
    cmp al,'Z'       ;Is the value low enough to be a capital letter?
    jbe .isLetter    ; yes
    cmp al,'a'       ;Is the value high enough to be a lower case letter?
    jae .isLetter    ; yes
                     ; no, not a letter
.notLetter:

Например (NASM):

;Inputs:
; ecx    Length of original string
; esi    Address of original string
;
;Outputs
; edi    Length of new string
; ebx    Address of new string

filterString:
    mov edi,esi      ;edi = address to store string (same address as original string)
    mov ebx,esi      ;ebx = address of both strings (used later)
    jecxz .done      ;Do nothing if the original string has zero length
    cld

.nextByte:
    lodsb            ;AL = next byte, ESI incremented
    cmp al,'A'       ;Is the value too low to be any letter?
    jb .doneByte     ; yes, not a letter
    cmp al,'z'       ;Is the value too high to be any letter?
    ja .doneByte     ; yes, not a letter
    cmp al,'Z'       ;Is the value low enough to be a capital letter?
    jbe .isLetter    ; yes, it's a capital letter
    cmp al,'a'       ;Is the value high enough to be a lower case letter?
    jb .doneByte     ; no, not a letter
                     ; yes, it's a lower case letter
.isLetter:
    stosb            ;Store AL at EDI, and increment EDI

.doneByte:
    loop .nextByte
.done:
    sub edi,ebx      ;edi = length of new string
    ret
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...