# #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 поймет инструкции.