2016-11-24 3 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 인 0이 끝나는 문자열을 dx에 반환합니다.

귀하의 :

cmp bl, 00h 
jle stop 

는 (도 및 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 ..."은 덮어 쓰기를 위해 많은 양의 바이트를 제공합니다. :)

(하지만 내가 당신에게 제안하는 것을 이해했는지 확인하십시오. 그렇다면 누군가가 묻는다면 설명 할 수 있습니다.)