装配TASM问题

时间:2015-12-14 23:53:13

标签: assembly tasm

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.

ASM:

   ;/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中运行它时,(在win 7中cmd将无法工作)与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)我在asm中也有这个代码,基本上只是做了类似的事情:

BEGIN


X:=2;  
Y:=2+X;
Z:=Y;

WRITELN("VALOR DE Z"); 
WRITELN( Z ); 


END programa1.

Asm:

;/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而不打印两次。 - 我使用了我发布的相同宏,并且还在Dosbox 0.74

中运行

有什么想法吗?谢谢顺便说一下。

Pd积。我在dell inspiron 64bit n5150 intel核心i7 2670Qm 2.20Ghz 6gb ram 为什么代码格式不能在issue2上运行?

1 个答案:

答案 0 :(得分:0)

我很确定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               

这应解决您在问题#1中的问题。