Masm dosbox 0.74 win7 Error A2049 - Assembler
Формулировка задачи:
Добрый день, хотел слинковать программу, но появляется ошибка, хотел спросить с чем она связана
ошибка показывает на эту строку
MAKEPATH FILE,FULLPATH
Описание: A2049: Illegal use of register
ошибка в 236 строке
вот код:
Последовательность действий, выполняемых программой.
Модуль типа .EXE выполняет следующие функции:
1) Подготавливает параметры для запуска загрузочного модуля из того же каталога, в котором находится он сам. Вызываемому модулю передается новая среда, созданная вызывающим модулем и новая командная строка.
2) Вызываемый модуль запускается с использованием загрузчика.
3) После запуска проверяется выполнение загрузчика, а затем результат выполнения вызываемой программы. Необходимо проверять причину завершения и, в зависимости от значения, выводить соответствующее сообщение. Если причина завершения 0, то выводится код завершения.
В качестве вызываемой программы взята программа lab2, которая распечатывает среду и командную строку.
.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
Заранее большое спасибо за помощь
Решение задачи: «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]
Объяснение кода листинга программы
ROAD2ZERO:MOV DX,ES:[BX]
- Здесь происходит перемещение регистра DX в память, адрес которой находится в регистре BX.CMP DX,0000H
- Происходит сравнение значения регистра DX с 0.JZ READPATH
- Если значение регистра DX равно 0, то выполняется переход на метку READPATH.INC BX
- Значение регистра BX увеличивается на 1.JMP ROAD2ZERO
- Происходит возврат к началу цикла (метке ROAD2ZERO).READPATH: ADD BX,4
- К значению регистра BX добавляется 4, и результат записывается обратно в регистр BX.MOV DI,OFFSET RESULTPATH
- В регистр DI записывается адрес строкиRESULTPATH
.COPYPATH: MOV DL,ES:[BX]
- В регистр DL записывается байт из памяти, адрес которой находится в регистре BX.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д