Проблема: я пытаюсь написать программу на ассемблере, в которой я принимаю пользовательский ввод и зашифровываю его по буквам посредством поворотов. У меня проблемы с моим 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