Я получаю ошибки "Access Violation" в моем l oop при использовании cmp (Assembly x86)? - PullRequest
0 голосов
/ 14 апреля 2020

Проблема: я пытаюсь написать программу на ассемблере, в которой я принимаю пользовательский ввод и зашифровываю его по буквам посредством поворотов. У меня проблемы с моим L1 l oop. Когда я компилирую свою программу, никаких проблем не возникает, но я продолжаю получать сообщение об ошибке при попадании в строку cmp [esi],ebx после принятия пользовательского ввода. Ошибка «Место чтения нарушения доступа 0x00B9A000».

Я был бы очень признателен, если бы кто-нибудь взглянул на мой код и помог мне выяснить, где я ошибся!

Код:

INCLUDE Irvine32.inc
BUFMAX = 128        ; maximum buffer size

.data
prompt   BYTE  "Please enter one plain text: ",0
encoded  BYTE  "The plain text after encoded: ",0
decoded  BYTE  "The plain text after decoded: "
key      BYTE  -5, 3, 2, -3, 0, 5, 2, -4, 7, 9
buffer   BYTE   BUFMAX+1 DUP(0)
bufSize  DWORD  ?


.code
main PROC
    call    InputTheString      ; input the plain text

    mov     edx, OFFSET buffer
    mov     ecx, LENGTHOF key
    mov     esi, OFFSET key
    mov     ebx, 0

L1:
    cmp [esi],ebx
    jl left_rotate

    cmp [esi],ebx
    jl right_rotate

    cmp [esi],ebx
    jl no_rotate

left_rotate:
    mov cl, [esi]
    rol edx, cl
    add esi, TYPE key
    inc edx
    loop L1

right_rotate:
    mov cl, [esi]
    ror edx, cl
    add esi, TYPE key
    inc edx
    loop L1

no_rotate:
    add esi, TYPE key
    loop L1

    exit
main ENDP

;-----------------------------------------------------
InputTheString PROC
;
; Prompts user for a plaintext string. Saves the string 
; and its length.
; Receives: nothing
; Returns: nothing
;-----------------------------------------------------
    pushad
    mov     edx,OFFSET prompt   ; display a prompt
    call    WriteString
    mov     ecx,BUFMAX      ; maximum character count
    mov     edx,OFFSET buffer   ; point to the buffer
    call    ReadString          ; input the string
    mov     bufSize,eax         ; save the length



    call    Crlf
    popad
    ret
InputTheString ENDP

;-----------------------------------------------------
DisplayMessage PROC
;
; Displays the encrypted or decrypted message.
; Receives: EDX points to the message
; Returns:  nothing
;-----------------------------------------------------
    pushad
    call    WriteString
    mov     edx,OFFSET buffer   ; display the buffer
    call    WriteString
    call    Crlf
    call    Crlf
    popad
    ret
DisplayMessage ENDP
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...