Assembly 组装TASM问题

Assembly 组装TASM问题,assembly,tasm,Assembly,Tasm,(一) 所以,我把这个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 .M

(一) 所以,我把这个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中运行它时,(Win7中的cmd不起作用),我遇到了这些错误

警告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) 我在asm中也有这段代码,基本上它只是做了一些类似的事情:

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”? -这就是答案,它应该只打印VALOR DE Z,而不是打印两次。 -我使用的宏与我发布的相同,也在Dosbox 0.74中运行

有什么想法吗?谢谢你

p.D.在dell inspiron 64位n5150 intel core i7 2670Qm 2.20Ghz 6gb ram中进行即时通讯
为什么代码格式在issue2上不起作用?

我相当肯定MASM需要
COMPI-ENDP
,但TASM只需要
ENDP
。此外,在您的一条语句中有一个单词
MACRO

COMPI  PROC
    I_ASIGNAR           2, X
    SUMAR               X, 2, T1
    I_ASIGNAR           T1, Y
    I_ASIGNAR           Y, Z
    I_MAYOR MACRO       X, Z, T2   ; <<<---  Remove "MACRO"
        JF                  T2, P1
    WRITE               cadena1
    ADD                 Z, 30H
    WRITE               Z
        JMP                 Q1
P1: 
    WRITE               cadena2
    ADD                 X, 30H
    WRITE               X
Q1: 
        ret
COMPI ENDP               
COMPI程序
I_ASIGNAR 2,X
苏玛X,2,T1
I_ASIGNAR T1,Y
I_ASIGNAR Y,Z

I_,X,Z,T2;我已经尝试修复最后一个代码块中的代码格式,但我似乎无法让它保持不变。我的建议是删除问题2,只留下问题1。然后为问题2提出一个单独的SO问题。我认为你的问题#1的问题在于你在
COMPI
过程中有这一行
I\u宏X,Z,T2
。宏
这个词应该不在那里。我想你的意思是
I\u X,Z,T2
。我想这会让TASM感到困惑,因为它认为你正在启动一个新的宏。没错!非常感谢你!然后,我将针对第2期提出一个新问题。谢谢。我猜这可能是您在编码时出现的复制粘贴错误(印刷错误)。如果是这样的话,我将投票结束问题1,因为它实际上只是一个打字错误。