2017-11-08 2 views
-1

잠시 동안 내 코드를 고치려고했지만 작동하지 못하는 것 같습니다. 항상 오류가 발생합니다. COM 파일을 생성 할 수 없으며 세그먼트를 스택으로 생성 할 수 없습니다. 어떻게하면이 문제를 해결할 수 있을까요?"오류 : COM 파일을 생성 할 수 없으므로 세그먼트를 현재 조각"을 수정하는 방법?

.model small 
.386 
.stack 100h 
.data 
    inpM db "Input string: $" 
    input db 19    ; max allowed 20 
       db ?    ; # char entered 
       db 19 dup(0) ; chars entered 
    output db 19 dup("$") 
.code 
start: mov ax, @data 
      mov ds, ax 

      mov ah, 9    ; print inpM 
      lea dx, inpM 
      int 21h 

      mov ah, 0Ah   ; get input 
      lea si, input 
      mov dx, si 
      int 21h 

      mov cl, [si+1]  ; reverse 
      mov ch, 0 
      add si, cx 
      inc si 
      lea di, output 

rev:  mov al, [si] 
      mov [di], al 
      dec si 
      inc di 
      loop rev 

again: mov ah, 6   ; clrscr 
      mov al, 0 
      mov cl, 0 
      mov ch, 0 
      mov dl, 4Fh 
      mov dh, 18h 
      mov bh, 0Fh 
      int 10h 

      mov ah, 0 
      mov bh, 0 
      mov dl, 27h   ; column 
      mov dh, 0    ; row 

      mov ah, 9    ; print output 
      lea dx, output 
      int 21h 

      mov bx, 20000  ; delay 
l1:  mov cx, 0Fh 

l2:  dec bx 
      loop l2 
      jnz l1 

      add dh, 1    ; adds 1 to row 

      loop again 

      mov ah, 4Ch 
      int 21h 
end start 

추가 정보 :

여기 내 코드의 내 코드는 문자열 입력을 반전 지연과 행에 표시합니다. 오류의 원인과 해결 방법을 찾으십시오.

답변

4

TASM 및 TLINK를 사용하여 EXE 파일이 아닌 .COM 프로그램으로 작성한다고 가정합니다. 이것은 당신이 무엇을 알고 있어야합니다 :

  • COM 프로그램이 tiny 모델,하지 small를 사용해야합니다.
  • .code 세그먼트 시작 후 COM 프로그램을 100h ORG 시작해야합니다.
  • COM 프로그램의 스택은 코드가 실행되는 세그먼트의 맨 위에서 시작하므로 스택 크기 설정을 제거해야합니다.
  • COM 프로그램에서 CS = DS = ES = SS이므로 EXE 파일을 작성하는 것처럼 더 이상 DS를 설정할 필요가 없습니다. 마음에 그런 것들로

,이 같은 표시 코드의 상단을 수정할 수 있습니다

.model tiny 
.386 
.data 
    inpM db "Input string: $" 
    input db 19    ; max allowed 20 
       db ?    ; # char entered 
       db 19 dup(0) ; chars entered 
    output db 19 dup("$") 
.code 
org 100h 
start: 
     mov ah, 9    ; print inpM 
     lea dx, inpM 
     int 21h 

     ... 

그런 다음 그것을 구축 할 수 있습니다 :

tasm myprg.asm 
tlink /t myprg.obj 
+1

나는 이유를 물어 봐도 'CS = DS = ES = SS' 목록에서'ES'를 제거 했습니까? .COM 파일의 경우 모든 4 개의 세그먼트 레지스터가 DOS에 의해 동일하게 설정됩니다. – Fifoernik

+1

@Fifoernik : 좋은 질문입니다. 몇 년 전 필자는 COM 프로그램을로드 할 때 ES를 설정하지 않은 DOS 버전이 있다는 저널 (Dr Dobbs) 중 하나에서 각주를 떠 올릴 것 같았다. 엄청난 양의주의에서 나는 누군가 나를 그것에 불렀을 때 그것을 제거했다. 나는 예외를 찾아 가기로 결심했고 그것을 찾을 수 없었다. 그래서 나는 그것에 대해 관심이 없다 (또는 그것은 나의 상상일지도 모른다). 나는 "PC Interns"가 그들 모두에게 나에게 충분히 좋은 PSP 세그먼트가로드되어있는 상태에서 다시 그것을 추가했다. –

관련 문제