1) Итак, у меня есть этот код asm в файле .asm, в основном он делает что-то вроде
BEGIN
X:=2;
Y:=2+X;
Z:=Y;
IF( Z > X ) THEN
WRITELN("VALOR DE Z");
WRITELN( Z );
ELSE
WRITELN("VALOR DE X");
WRITELN( X );
END;
END programa1.
АСМ здесь:
;/StartHeader
INCLUDE macrose.mac
DOSSEG
.MODEL SMALL
STACK 100h
.DATA
BUFFER DB 8 DUP('$') ;23h
BUFFERTEMP DB 8 DUP('$') ;23h
BLANCO DB '#'
BLANCOS DB '$'
MENOS DB '-$'
COUNT DW 0
NEGATIVO DB 0
ARREGLO DW 0
ARREGLO1 DW 0
ARREGLO2 DW 0
LISTAPAR LABEL BYTE
LONGMAX DB 254
TOTCAR DB ?
INTRODUCIDOS DB 254 DUP ('$')
MULT10 DW 1
NUM DW ?
X dw ?
Y dw ?
Z dw ?
T1 dw ?
T2 dw ?
cadena1 db "VALOR DE Z",'$'
cadena2 db "VALOR DE X",'$'
.CODE
.386
BEGIN:
MOV AX, @DATA
MOV DS, AX
CALL COMPI
MOV AX, 4C00H
INT 21H
COMPI PROC
I_ASIGNAR 2, X
SUMAR X, 2, T1
I_ASIGNAR T1, Y
I_ASIGNAR Y, Z
I_MAYOR MACRO X, Z, T2
JF T2, P1
WRITE cadena1
ADD Z, 30H
WRITE Z
JMP Q1
P1:
WRITE cadena2
ADD X, 30H
WRITE X
Q1:
ret
COMPI ENDP
END BEGIN
И когда я пытаюсь запустить его в cmd dosbox (cmd в win 7 не будет работать) с tasm file.asm, у меня возникают эти ошибки
Предупреждение codigo.asm() Открыть процедуру: COMPI
Неустранимая codigo.asm(55) Обнаружен неожиданный конец файла
Я не знаю, почему, потому что я почти уверен, что закрываю процедуру и начинаю, кроме того, последняя строка в моем файле - 54, и я не знаю, почему мне говорят, что проблема в строке 55.
Эти макросы я использую:
JF MACRO VALOR1,DESTINO
MOV AX,VALOR1
CMP AX,1
JNE DESTINO
ENDM
WRITE MACRO MESSAGE
PUSH AX ;EXTRA
MOV AH, 09H
LEA DX, MESSAGE
INT 21H
POP AX ;EXTRA
ENDM
I_ASIGNAR MACRO OPERANDO2, OPERANDO1
PUSH AX
MOV AX, OPERANDO2
MOV OPERANDO1, AX
POP AX
ENDM
SUMAR MACRO OPERANDO2, OPERANDO1, RESULTADO
PUSH AX
MOV AX, OPERANDO1
ADD AX, OPERANDO2
MOV RESULTADO, AX
POP AX
ENDM
I_MAYOR MACRO OPERANDO2, OPERANDO1, RESULTADO
LOCAL LABEL1
LOCAL SALIR
PUSH AX
MOV AX, OPERANDO1
CMP AX, OPERANDO2
JLE LABEL1
MOV RESULTADO, 1
JMP SALIR
LABEL1:
MOV RESULTADO, 0
SALIR:
POP AX
ENDM
2) У меня также есть этот код на ассемблере, в основном он просто делает что-то вроде:
BEGIN
X:=2;
Y:=2+X;
Z:=Y;
WRITELN("VALOR DE Z");
WRITELN( Z );
END programa1.
Асм здесь:
;/StartHeader
INCLUDE macrose.mac
DOSSEG
.MODEL SMALL
STACK 100h
.DATA
BUFFER DB 8 DUP('$') ;23h
BUFFERTEMP DB 8 DUP('$') ;23h
BLANCO DB '#'
BLANCOS DB '$'
MENOS DB '-$'
COUNT DW 0
NEGATIVO DB 0
ARREGLO DW 0
ARREGLO1 DW 0
ARREGLO2 DW 0
LISTAPAR LABEL BYTE
LONGMAX DB 254
TOTCAR DB ?
INTRODUCIDOS DB 254 DUP ('$')
MULT10 DW 1
NUM DW ?
X dw ?
Y dw ?
Z dw ?
T1 dw ?
cadena1 db "VALOR DE Z",'$'
.CODE
.386
BEGIN:
MOV AX, @DATA
MOV DS, AX
CALL COMPI
MOV AX, 4C00H
INT 21H
COMPI PROC
I_ASIGNAR 2, X
SUMAR X, 2, T1
I_ASIGNAR T1, Y
I_ASIGNAR Y, Z
WRITE cadena1
ADD Z, 30H
WRITE Z
ret
COMPI ENDP
END BEGIN
Но у меня есть другая проблема (у меня нет ошибки открытой процедуры, почему?), что я печатаю: VALOR DE Z1 VALOR DE Z
-Почему я печатаю "VALOR DE Z" дважды? -1 это ответ, хотя он должен печатать только VALOR DE Z и 1, а не дважды. -Я использую те же макросы, что и выложил, а также работаю в Dosbox 0.74.
Есть идеи? Спасибо кстати.
П.Д. Im в Dell Inspiron 64bit n5150 Intel Core i7 2670Qm 2.20Ghz 6gb ram Почему формат кода не работает на issue2?
I_MAYOR MACRO X, Z, T2
в процедуреCOMPI
. СловоMACRO
там быть не должно. Я думаю, вы имели в видуI_MAYOR X, Z, T2
. Я думаю, что это приводит TASM в замешательство, так как он думает, что вы запускаете новый макрос. - person Michael Petch   schedule 15.12.2015