2015-12-17 2 views
1

Я дошел до последнего раздела кода программы, которая проверяет, является ли данная строка палиндром. Однако у меня есть одна вещь, в которой мне нужна помощь.Сравнение позиций указателя TASM

У меня есть указатели si и di, указывающие на первый и последний символы линии. Я использую их для сравнения символов, а затем двигаюсь дальше. Тем не менее, мне также нужно сравнить позиции самих указателей, поэтому я знаю, где мне нужно остановиться, поскольку я знаю, что линия является палиндром.

Вот сегмент кода, который выполняет сравнение.

is_pol PROC near 
mov si, offset currentline 
mov di, offset currentline 
add di, currentline_offset 

comparesi: 
    cmp si, 'a'   
     jl notsmallsi 
    cmp si, 'z' 
    jg notsymbolsi 
    jmp comparedi 
notsmallsi: 
    cmp si, 'A' 
    jl notlargesi 
    cmp si, 'Z' 
    jg notsymbolsi 
    jmp comparedi 
notlargesi: 
    cmp si, '0' 
    jl notsymbolsi 
    cmp si, '9' 
    jg notsymbolsi 
    jmp comparedi 
notsymbolsi: 
    inc si 
    jmp comparesi 
comparedi: 
    cmp di, 'a' 
    jl notsmalldi 
    cmp di, 'z' 
    jg notsymboldi 
    jmp compare 
notsmalldi: 
    cmp di, 'A' 
    jl notlargedi 
    cmp di, 'Z' 
    jg notsymboldi 
    jmp compare 
notlargedi: 
    cmp di, '0' 
    jl notsymboldi 
    cmp di, '9' 
    jg notsymboldi 
    jmp compare 
notsymboldi: 
    dec di 
    jmp comparedi 
compare: 
    cmp si, di 
    jne no_palindrome 
    inc si 
    dec di 

    jmp is_palindrome 
    jmp comparesi 

no_palindrome: 
    lea dx, not_palindrome 
    mov cx, 30 
    ret 

is_palindrome: 
    lea dx, palindrome 
    mov cx, 30 
    ret 
is_pol ENDP 

Раздел кода, который отсутствует является один между «разлом ди» и «JMP is_palindrome»

Я ценю помощь.

ответ

3

SI и DI указатели. Поскольку указатель - это просто адрес памяти, они содержат «позиции самих указателей». Вы можете сравнить их и разбить цикл, если адрес памяти левого указателя увеличения указателя ниже или равен, чем адрес памяти правой начальной точки декрементации, то есть SI < = DI.

Огромная ошибка. Чтобы сравнить значения памяти, вы должны разыменовать указатели. На данный момент вы сравниваете указатели с символом (cmp si, 'a'). Разница SI или DI с кронштейнами и добавьте размер: cmp byte ptr [si], 'a'.

 Смежные вопросы

  • Нет связанных вопросов^_^