首页 > 解决方案 > 创建简单的加法计算但编译时出错 [汇编代码]

问题描述

我目前正在学习汇编语言。这并不容易,我还在学习,但我想通过从用户那里获取值来创建一个简单的加法计算,但我什至无法让编译器运行我一直说的代码 illegal command:

在此处输入图像描述 文件名为USERSUM.ASM

我正在使用DOSbox使用TASM 文件编写我的汇编代码

title Calculate 2 Sum
; This program is to calculate the sum input from the user

.model small
.stack 100h

.data
input1 db 0ah, odh, "Input 1st Number: ", "$"
input2 db 0ah, odh, "Input 2nd Number: ", "$"
output db 0ah, odh, "The sum is: ", "$"

number 1 dw ?
number 2 dw ?
result dw ?

.code
main  proc

      MOV ax, @data
      MOV ds,ax

;Print 1st Message Input
      MOV ah, 9
      MOV dx,offset input1
      int 21h

      MOV ah, 1
      int 21h
      MOV bl, al

;Print 2nd Message Input
      MOV ah, 9
      MOV dx,offset input2
      int 21h

      MOV ah, 1
      int 21h
      MOV bh, al

;addition
      SUB number1,'0'
      SUB number2,'0'

      MOV ax, number1
      add ax, number2

      MOV result, ax
      add result,'0'

;Print Output 
      MOV ah, 9
      MOV dx,offset output
      int 21h

      MOV ah, 2
      MOV dl, bh
      int 21h

      MOV ax, 4C00h
      int 21h

main  endp
end   main

我希望我的输出是这样的: -

Input 1st Number: 2
Input 2nd Number: 4
The sum is: 6

我无法弄清楚问题所在。我是否遗漏了代码中的某些内容,或者我忘记了输入一些重要的内容?谁能告诉我我做错了什么?

标签: assemblydosx86-16tasm

解决方案


这是因为寄存器dl是一个字节,但你的变量result被定义为一个dw所以汇编器说operand is not same

只需使用ptr运算符将​​类型更改result字节,如下所示

MOV dl, byte ptr result

或者只是使用dx

mov dx,result

这是我从您的答案中的代码修改的代码,请注意它0dh不是odh

.model small
.stack 100h
    
.data
input1 db 0ah, 0dh, "Input 1st Number: ", "$";NOTE here and the next 2 lines is 0dh instead of odh
input2 db 0ah, 0dh, "Input 2nd Number: ", "$"
output db 0ah, 0dh, "The sum is: ", "$"

number1 dw ?
number2 dw ?
result dw ?

.code
main  proc

      MOV ax, @data
      MOV ds,ax

;Print 1st Message Input
      MOV ah, 9
      MOV dx,offset input1
      int 21h

      MOV ah, 1
      int 21h
      MOV number1, ax

;Print 2nd Message Input
      MOV ah, 9
      MOV dx,offset input2
      int 21h

      MOV ah, 1
      int 21h
      MOV number2, ax

;addition
      SUB number1,'0'
      SUB number2,'0'

      MOV ax, number1
      add ax, number2

      MOV result, ax
      add result,'0'

;Print Output
      MOV ah, 9
      MOV dx,offset output
      int 21h

      MOV ah, 2
      MOV dx,  result;or use mov dl,byte ptr result
      int 21h

      MOV ax, 4C00h
      int 21h

main  endp
end   main

代码的输出


推荐阅读