2016-11-24 7 views
0

Я работаю над программой, которая проверяет палиндромные слова.Программирование Emu8086

#make_COM# 
include emu8-86.inc 
org 100h 
mov ax, 1000 
mov ds, ax 
call pthis 

db "This program inputs a string and check for the palindromic words." ,0 
putc 0dh 
putc 0ah 
begin: 
mov ax, 7000h 
mov ds, ax 
mov di, 0000 
call pthis 

db "Enter a string: ",0 
mov dx, 10 
call GET_STRING 
mov cx, dx 
putc 0dh 
putc 0ah 
back: 
mov bl, [di] 
cmp bl, 00h 
jle stop 
cmp bl, 41h 
jl Not_A_Letter 
cmp bl, 5Ah 
jle Check_for_length 
cmp bl, 61h 
jl Not_A_Letter 
cmp bl, 7Ah 
jle Check_for_length 

Not_A_Letter: 
putc 0dh 
putc 0ah 
call pthis 
db "You did not enter a valid string", 0 

Check_for_length: 
ret 

Мне просто интересно, как я могу проверить длину входной строки.

+0

Добро пожаловать в SO! Возможно, вам стоит подумать о правильном форматировании кода, чтобы ваш код был более читаемым. –

+0

Что вы уже пробовали? –

+0

Я мог заставить его работать, используя прерывание 21. Но дело в том, что мне не разрешено использовать. Тогда я понятия не имею, как это должно быть сделано. –

ответ

0

GET_STRING возвращает нулевую строку в ds:di максимального размера в dx.

Ваш

cmp bl, 00h 
jle stop 

поймает, что один (а также любой символ с 0x80-0xFF значением). Но, может быть, вы предпочтете использовать je для перехода только после достижения конца строки?

Знак stop:di содержит длину строки (может быть укорочена, если встречается 0x80-0xFF char). Я не вижу в вашем коде stop:.


Кстати, почему вы используете 7000:0000 для буфера строки? Этот сегмент рекомендован кем-то, или вы просто стреляете в темноту, надеясь, что повезет?

У вас около 60+ (в зависимости от длины используемой командной строки) байты перед 0x0100, или вы можете зарезервировать место в конце вашего кода. Если вы хотите сохранить смещение 0, я пошел бы для командной строки пространства:

mov ax,cs 
add ax,(100h-32)/16 
mov ds,ax ; ds:0000 points 32 bytes ahead of first instruction of code. 

Или на самом деле, если вы хотите быть хардкор, вы можете сделать add ax,16 в этой точке кода, чтобы переписать начало кода (как он уже был выполнен, и строка "This program inputs ..." обеспечивает большой запас байтов для перезаписи). :)

(но убедитесь, что вы понимаете, что я вам предлагаю, поэтому вы можете объяснить, почему, если кто-то спрашивает).

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