Assembly 组装TASM问题
(一) 所以,我把这个asm代码放在一个.asm文件中,基本上是这样做的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
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,因为它实际上只是一个打字错误。