Assembly Nasm“;“期望指令”;问题是我的编译器还是我的代码
我对NASM还相当陌生,我已经想把我的脑袋炸了,因为我不知道为什么我一直收到这个错误“预期指令”第14行。是我的编译器还是我的代码。请帮帮我,我已经干了好几个小时了,现在不知道该怎么办Assembly Nasm“;“期望指令”;问题是我的编译器还是我的代码,assembly,x86,nasm,Assembly,X86,Nasm,我对NASM还相当陌生,我已经想把我的脑袋炸了,因为我不知道为什么我一直收到这个错误“预期指令”第14行。是我的编译器还是我的代码。请帮帮我,我已经干了好几个小时了,现在不知道该怎么办 section .data CELC DB ? FARH DB ? MSG1 DB 'INPUT VALUE OF CENTIGRADE','$' MSG DB 'EQUIVALENT FARHRENEHEIT IS','$' section .text global _start section
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行说
假设CS:CSEG,DS:DSEG
,这是一种MASM方式,告诉汇编程序应该使用哪个段寄存器来寻址段CSEG
和DSEG
。而不是您声明的.data
、.text
和.code
段(别名段)。除此之外。注释掉第14行,并声明部分数据
和代码
,这在DOS程序中很常见
NASM要求对内存变量内容的引用必须放在方括号内。
而不是MOV-CELC,AL;将输入值移到'CELC'
您需要的MOV[CELC],AL
等,或者使用未使用的寄存器BX、SI、DI代替内存变量。顺便说一句,最好将温度计算为16位有符号整数,否则将限制在0..255度的范围内
在INT 21h
之前,在AH
中修改并集中到适当的功能标识符。您需要AH=09h
来显示提示。不要忘记,当用户在键盘上输入5时,DOS函数AH=1
在AL
中返回35h,这不是您应该使用的值
我建议从一些HelloWorld示例开始,学习在DOSBox中使用TLINK和TurboDebugger,只有在所有功能都正常时,才逐步添加更多功能。此代码采用MASM语法,因此需要转换为NASM语法。另一种选择是将其与MASM或JWASM(Linux/Windows//MacOS/DOS等上可用的MASM的开源替代品)组装在一起。请注意,此代码旨在在DOS下运行。不要指望它能在Linux或64位Windows上运行。由于NTVDM组件,它可以在32位Windows上运行,但它仍然是一个DOS程序。如果您希望此代码在Linux/64位Windows/OSX或其他操作系统上运行,则需要一个模拟器。DOSBox是一种在虚拟x86环境中运行DOS程序的常用工具。