Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly Nasm“;“期望指令”;问题是我的编译器还是我的代码_Assembly_X86_Nasm - Fatal编程技术网

Assembly Nasm“;“期望指令”;问题是我的编译器还是我的代码

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

我对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行说
假设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程序的常用工具。