2016-11-24 9 views
0

私は、パリンドローム語をチェックするプログラムに取り組んできました。Emu8086 programming

#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

ようこそ!たぶん、適切なコードの書式設定を使用して、コードを読みやすくすることを検討する必要があります。 –

+0

何を試しましたか? –

+0

私は割り込み21を使用して動作させることができます。しかし、事は私が使用することが許されていないということです。それでは、どうすればいいのか分かりません。 –

答えて

0

GET_STRINGは、ds:diの最大サイズのゼロ終端文字列をdxに戻しています。

あなた:

cmp bl, 00h 
jle stop 

はその1をキャッチ(とも0x80-0xFF値を持つ任意の文字)になります。しかし、おそらくjeを使用して、文字列の終わりに達したときにだけジャンプしたいと思うかもしれませんか?

stop:ラベルでは、diには文字列の長さが含まれています(0x80-0xFF charが検出された場合は短縮されることがあります)。あなたのコードにstop:ラベルが表示されません。


なぜ、7000:0000を文字列バッファーに使用しますか?そのセグメントは誰かが推薦しているのでしょうか、幸運を祈るために暗闇に向かって撮影していますか?

0x0100より約60+(使用されているコマンドラインの長さによって異なる)バイトがあるか、コードの最後にスペースを予約できます。 (として

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を行うことができます。あなたは0オフセットキープしたい場合は、私は、コマンドライン・スペースのために行くだろうすでに実行されており、文字列"This program inputs ..."は、上書きするためのバイトの準備ができています)。 :)

(ただし、私があなたに何を示唆しているかを必ず確認してください。