纳斯姆"instruction expected"问题是我的编译器还是我的代码



我是NASM的新手,我已经想炸了我的脑袋了,因为我不知道为什么我一直会出现这个错误"预期指令";第14行。是我的编译器还是我的代码。请帮帮我,我已经做了好几个小时了,现在我不知道该怎么办。

section .data
CELC DB ?
FARH DB ?
MSG1 DB 'INPUT VALUE OF CENTIGRADE','$'
MSG DB 'EQUIVALENT FARHRENEHEIT IS','$'
section .text
global _start
section .code
_start:
ASSUME CS:CSEG, DS:DSEG
MOV AX,DSEG
MOV DS,AX ; INITIALIZE DATA SEGMENT
LEA DX,MSG1
MOV AH, 01H

INT 21H ; DISPLAY "INPUT VALUE IN CELC"
MOV AH, 01H

INT 21H ; INPUT VALUE IN CELC
MOV CELC,AL ; MOVE THE INPUT VALUE TO 'CELC'
MOV AL,CELC
MOV CL,09H
MOV CH,00H
MUL CL ; AX=9*CELC
MOV CL,05H
DIV CL ; AL=AX/CL=(9*CELC)/5
ADD AL,20H ; ADD 20H=32 TO AL TO GET FAHR
MOV FARH, AL ; FAHR=(9*CELC)/5+32
MOV AH,4CH
INT 21H

在代码中发现的错误几乎从来都不是编译器错误。第14行说ASSUME CS:CSEG, DS:DSEG,这是MASM告诉汇编程序它应该使用哪个段寄存器来寻址段CSEGDSEG的方式。但是,您声明了.data.text.code,而不是这些段(别名sections(。除此之外,NASM并没有假设。注释掉第14行,并声明DATACODE部分,这在DOS程序中是常见的。

NASM要求对内存变量内容的引用位于方括号中。您需要MOV [CELC],AL等,而不是
MOV CELC,AL ; MOVE THE INPUT VALUE TO 'CELC'。或者使用未使用的寄存器BX、SI、DI来代替内存变量。顺便说一句,最好将温度计算为16位有符号整数,否则您将被限制在0..255度的范围内。

对DOS函数进行了修正,并在INT 21h之前将注意力集中在AH中合适的函数识别器上。您需要AH=09h来显示提示。不要忘记,当用户在键盘上输入5时,DOS函数AH=1AL中返回35h,这不是您应该使用的值。

我建议从HelloWorld的一些例子开始,学习在DOSBox中使用TLINK和TurboDebugger,只有当一切正常时,才能逐步添加更多功能。

相关内容

  • 没有找到相关文章

最新更新