Masm dosbox 0.74 win7 Error A2049 - Assembler

Узнай цену своей работы

Формулировка задачи:

Добрый день, хотел слинковать программу, но появляется ошибка, хотел спросить с чем она связана ошибка показывает на эту строку MAKEPATH FILE,FULLPATH Описание: A2049: Illegal use of register ошибка в 236 строке вот код:
.286

STK       SEGMENT   STACK
          DW 100 DUP (0)
STK       ENDS

DATA      SEGMENT
          STR_SFREE      DB   'Free: success',0DH,0AH,'$'
          
          STR_ERR1       DB   'ERROR: Invalid function number',0DH,0AH,'$'
          STR_ERR2       DB   'ERROR: File not found',0DH,0AH,'$'
          STR_ERR3       DB   'ERROR: Path not found',0DH,0AH,'$'
          STR_ERR5       DB   'ERROR: Access denied',0DH,0AH,'$'
          STR_ERR7       DB   'ERROR: Memory control blocks destroyed',0DH,0AH,\
                              '$'
          STR_ERR8       DB   'ERROR: Insufficient memory',0DH,0AH,'$'
          STR_ERR9       DB   'ERROR: Invalid memory block address',0DH,0AH,'$'
          STR_ERRA       DB   'ERROR: Invalid environment',0DH,0AH,'$'
          STR_ERRB       DB   'ERROR: Invalid format',0DH,0AH,'$'
          STR_UNERR      DB   'ERROR: Unknown',0DH,0AH,'$'
          
          STR_RET0       DB   'Ret 0: Exit success',0DH,0AH,'$'
          STR_RET1       DB   'Ret 1: Ctrl-Break',0DH,0AH,'$'
          STR_RET2       DB   'Ret 2: Device error',0DH,0AH,'$'
          STR_RET3       DB   'Ret 3: 31H exit',0DH,0AH,'$'
          STR_UNRET      DB   'Ret code: unknown',0DH,0AH,'$'
          
          STR_SUBRET     DB   'Subprocess returns: " " -   H',0DH,0AH,'$'
 
          FILE           DB   'LAB2.COM',0
          FULLPATH       DB   128 DUP (0)
          CMDLINE        DB   24," CMDLINE TAIL FROM LAB6",0DH 
          
          ENV            DW   ENVS
                         DW   OFFSET CMDLINE
                         DW   SEG CMDLINE
                         DD   0              ; FCB 1
                         DD   0              ; FCB 2
DATA      ENDS

; новая среда
ENVS      SEGMENT        'ENVIRONMENT'
                         DB   'FIRSTNAME=ALEKSANDR',0
                         DB   'LASTNAME=PLOSKOV',0
                         DB   'SUBJECT=LAB6 EXECUTION',0
          ENVEND         DB   0    ; из л/р №2: окружение должно заканчиваться
                                   ; двумя нулями
ENVS      ENDS

CODE      SEGMENT
          ASSUME         CS:CODE, DS:DATA, SS:STK, ES:NOTHING
          
          KEEP_SS        DW   0
          KEEP_SP        DW   0
          KEEP_ERR       DW   0
          
TETR2HEX  PROC      NEAR
          AND       AL,0FH
          CMP       AL,09
          JBE       NEXT
          ADD       AL,07
NEXT:     ADD       AL,30H
          RET
TETR2HEX  ENDP

BYTE2HEX  PROC      NEAR
          PUSH      CX
          MOV       AH,AL
          CALL      TETR2HEX
          XCHG      AL,AH
          MOV       CL,4
          SHR       AL,CL
          CALL      TETR2HEX      
          POP       CX             
          RET
BYTE2HEX  ENDP

WORD2HEX  PROC      NEAR
          PUSH      BX
          MOV       BH,AH
          CALL      BYTE2HEX
          MOV       [DI],AH
          DEC       DI
          MOV       [DI],AL
          DEC       DI
          MOV       AL,BH
          CALL      BYTE2HEX
          MOV       [DI],AH
          DEC       DI
          MOV       [DI],AL
          POP       BX
          RET
WORD2HEX  ENDP

BYTE2DEC  PROC      NEAR
          PUSH      CX
          PUSH      DX
          PUSH      AX
 
          XOR       AH,AH
          XOR       DX,DX
          MOV       CX,10
LOOP_BD:  DIV       CX
          OR        DL,30H
          MOV       [SI],DL
          DEC       SI
          XOR       DX,DX
          CMP       AX,10
          JAE       LOOP_BD
          CMP       AL,00H
          JE        END_L
          OR        AL,30H
          MOV       [SI],AL
          
END_L:    POP       AX
          POP       DX
          POP       CX
          RET
BYTE2DEC  ENDP

MAKEPATH  MACRO     FILENAME,RESULTPATH
          PUSH      ES
          PUSH      BX
          PUSH      DX
          PUSH      DI
          PUSH      SI
          MOV       ES,ES:[002CH]
          XOR       BX,BX
          
ROAD2ZERO:MOV       DX,ES:BX
          CMP       DX,0000H
          JZ        READPATH
          INC       BX
          JMP       ROAD2ZERO
READPATH: ADD       BX,4
          MOV       DI,OFFSET RESULTPATH
          
COPYPATH: MOV       DL,ES:BX
          MOV       [DI],DL
          INC       DI
          INC       BX
          CMP       DL,00H
          JNZ       COPYPATH
BACKPATH: DEC       DI
          MOV       DL,[DI]
          CMP       DL,92
          JNE       BACKPATH
          MOV       SI,OFFSET FILENAME
COPYNAME: INC       DI
          MOV       DL,[SI]
          MOV       [DI],DL
          INC       SI
          CMP       DL,00H
          JNZ       COPYNAME
          
          POP       SI
          POP       DI
          POP       DX
          POP       BX
          POP       ES
          ENDM
          
FORMATRES PROC      NEAR
          PUSH      SI
          PUSH      AX
          
          MOV       SI,OFFSET STR_SUBRET+21
          MOV       [SI],AL
          
          CALL      BYTE2HEX          
          MOV       SI,OFFSET STR_SUBRET+26
          MOV       [SI],AL
          MOV       [SI+1],AH
          
          POP       AX
          POP       SI
          RET
FORMATRES ENDP

PUTS      MACRO     STRING
          PUSH      AX
          PUSH      DX
          
          MOV       DX,OFFSET STRING
          MOV       AH,09H
          INT       21H
          
          POP       DX
          POP       AX
          ENDM

; Точка входа
MAIN      PROC      NEAR
          ; указываем DS на сегмент данных DATA
          MOV       AX,DATA
          MOV       DS,AX
 
          ; выделяем память для загружаемой программы
          MOV       BX,OFFSET PROGEND
          MOV       AH,4AH
          INT       21H
          JNC       PREPARE
          
          CMP       AX,07H
          JNE       TESTERR8
          PUTS      STR_ERR7
          JMP       EXIT
          
TESTERR8: CMP       AX,08H
          JNE       TESTERR9
          PUTS      STR_ERR8
          JMP       EXIT
          
TESTERR9: CMP       AX,09H
          JNE       UNERRFREE
          PUTS      STR_ERR9
          JMP       EXIT
          
UNERRFREE:PUTS      STR_UNERR
          JMP       EXIT
          
PREPARE:  
         MAKEPATH  FILE,FULLPATH
 
          PUSH      DS
          PUSH      ES
          MOV       KEEP_SS,SS
          MOV       KEEP_SP,SP
          PUSH      DS
          POP       ES
          MOV       DX,OFFSET FULLPATH
          MOV       BX,OFFSET ENV
          MOV       AH,4BH
          MOV       AL,00H
          INT       21H
          MOV       SS,KEEP_SS
          MOV       SP,KEEP_SP
          POP       ES
          POP       DS
          JC        ERROR1
          MOV       AH,4DH
          INT       21H
          CALL      FORMATRES
          PUTS      STR_SUBRET
          CMP       AH,00H
          JNE       RET1
          PUTS      STR_RET0
          JMP       EXIT
          
RET1:     CMP       AH,01H
          JNE       RET2
          PUTS      STR_RET1
          JMP       EXIT
          
RET2:     CMP       AH,02H
          JNE       RET3
          PUTS      STR_RET2
          JMP       EXIT
          
RET3:     CMP       AH,03H
          JNE       UNRET
          PUTS      STR_RET3
          JMP       EXIT
          
UNRET:    PUTS      STR_UNRET
          JMP       EXIT
          
ERROR1:   CMP       AX,01H
          JNE       ERROR2
          PUTS      STR_ERR1
          JMP       EXIT
          
ERROR2:   CMP       AX,02H
          JNE       ERROR3
          PUTS      STR_ERR2
          JMP       EXIT
          
ERROR3:   CMP       AX,03H
          JNE       ERROR5
          PUTS      STR_ERR3
          JMP       EXIT
          
ERROR5:   CMP       AX,05H
          JNE       ERROR8
          PUTS      STR_ERR5
          JMP       EXIT
          
ERROR8:   CMP       AX,08H
          JNE       ERRORA
          PUTS      STR_ERR8
          JMP       EXIT
          
ERRORA:   CMP       AX,0AH
          JNE       ERRORB
          PUTS      STR_ERRA
          JMP       EXIT
          
ERRORB:   CMP       AX,0BH
          JNE       UNERR
          PUTS      STR_ERRB
          JMP       EXIT
          
UNERR:    PUTS      STR_UNERR
          
EXIT:     XOR       AL,AL
          MOV       AH,4CH
          INT       21H
          RET
MAIN      ENDP
PROGEND:
CODE      ENDS
          END       MAIN
Последовательность действий, выполняемых программой. Модуль типа .EXE выполняет следующие функции: 1) Подготавливает параметры для запуска загрузочного модуля из того же каталога, в котором находится он сам. Вызываемому модулю передается новая среда, созданная вызывающим модулем и новая командная строка. 2) Вызываемый модуль запускается с использованием загрузчика. 3) После запуска проверяется выполнение загрузчика, а затем результат выполнения вызываемой программы. Необходимо проверять причину завершения и, в зависимости от значения, выводить соответствующее сообщение. Если причина завершения 0, то выводится код завершения. В качестве вызываемой программы взята программа lab2, которая распечатывает среду и командную строку.
Заранее большое спасибо за помощь

Решение задачи: «Masm dosbox 0.74 win7 Error A2049»

textual
Листинг программы
ROAD2ZERO:MOV       DX,ES:[BX]
          CMP       DX,0000H
          JZ        READPATH
          INC       BX
          JMP       ROAD2ZERO
READPATH: ADD       BX,4
          MOV       DI,OFFSET RESULTPATH
          
COPYPATH: MOV       DL,ES:[BX]

Объяснение кода листинга программы

  1. ROAD2ZERO:MOV DX,ES:[BX] - Здесь происходит перемещение регистра DX в память, адрес которой находится в регистре BX.
  2. CMP DX,0000H - Происходит сравнение значения регистра DX с 0.
  3. JZ READPATH - Если значение регистра DX равно 0, то выполняется переход на метку READPATH.
  4. INC BX - Значение регистра BX увеличивается на 1.
  5. JMP ROAD2ZERO - Происходит возврат к началу цикла (метке ROAD2ZERO).
  6. READPATH: ADD BX,4 - К значению регистра BX добавляется 4, и результат записывается обратно в регистр BX.
  7. MOV DI,OFFSET RESULTPATH - В регистр DI записывается адрес строки RESULTPATH.
  8. COPYPATH: MOV DL,ES:[BX] - В регистр DL записывается байт из памяти, адрес которой находится в регистре BX.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.5 из 5