Цикл палиндрома сборки на базе Intel x86

# #assembly #x86

Вопрос:

Я работаю над проектом для школы. запуск отладчика gdb показывает, что при уменьшении регистра в функции на байт это не уменьшает местоположение, а уменьшает значение ascii, заданное для буквы. например, w показывает 77, вместо этого при запуске цикла он просто изменил одну сторону на 76, а другую на 78. У меня будет блок комментариев по проблеме со звездой.`

 BITS 32
global _start
section .data
userMsg: DW 'Please enter a String to check:'
lenUserMsg EQU $-userMsg
usereMsg DB 'Is a Palindrome'
lenUsereMSG EQU $-usereMsg
usrMsg DB 'Is not a Palindrome'
lenUsrMsg EQU $-usrMsg
;Questions
Section .bss
s:RESB 1024
w:RESB 1024
section .text
_start:
;promping the user to enter a string in which to check for palindrome
Loop_Palindrome:
    mov eax, 4
    mov ebx, 1
    mov ecx, userMsg
    mov edx, lenUserMsg
int 80h
    mov eax, 3
    mov ebx, 0
    mov ecx, w
    mov edx, s
int 80h
cmp eax, 0     
je exit
cmp BYTE [w], 10
je exit
    mov esi, w 
    mov edi, w
    sub eax, 2
    add edi, eax 
push esi 
push edi 
call is_palindrome
jmp isPal 
;starting the palindrome test
is_palindrome:
push ebp    
mov ebp, esp 
    mov edx, [ebp   8] ;is that edi
    mov ebx, [ebp   12] ;is that esi
loop1:
    mov al, [ebx] ;word
    mov ah, [edx]
cmp ebx, edx 
jge isPal    
cmp al, ah 
jne notPal 
    dec edx ;Problem *
    inc ebx ;Problem *
jmp loop1
finished:
pop ebp ;
pop edi ;restoring the values
pop esi ;
ret ;return to below function call
notPal:
    mov eax, 4
    mov ebx, 1
    mov ecx, usrMsg
    mov edx, lenUsrMsg
int 80h
isPal:
    mov eax, 4
    mov ebx, 1
    mov ecx, usereMsg
    mov edx, lenUsereMSG
int 80h
    jmp Loop_Palindrome
exit:
    mov eax, 1
    mov ebx, 0
int 80h
 

Комментарии:

1. Строки, которые вы отметили как «проблема», должны просто стать dec edx и inc ebx . К сожалению, это не единственное, что здесь не так. например. Ваша петля1: метка помещена слишком высоко в процедуре!

2. Не могли бы вы, пожалуйста, удалить все эти лишние пустые строки из программы? Это очень затрудняет рецензирование. Нажмите кнопку «Изменить» под вопросом.

3. ты все исправил. Спасибо, сэр.

4. Кстати, вам не нужно и не следует использовать bits 32 . Это позволяет случайно собрать 32-разрядный машинный код в -felf64 объектный файл, вместо того, чтобы ассемблер останавливал вас на инструкции, подобной push ebp той, которая недопустима в 64-разрядном режиме.

5. Питер Кордес, я использую 32-разрядную сборку и 64 — разрядный nasm. В нашей школе не преподают 64-битную сборку. При определении разрядов 32 компилятор nasm поймет инструкции.