在汇编语言程序中乘以单词似乎是正确的,但没有返回正确的答案

时间:2016-10-24 05:07:43

标签: assembly dos tasm

哦,小男孩......我从哪里开始?我尝试过第二次来获得一个简单的程序来计算一个盒子的表面积(只有4个或更少的乘法步骤)并返回总面积。我尝试使用主要变量定义程序,然后再将其作为字节。但无论怎样,我都会得到一个不匹配的答案。我的程序没有错误或警告,所以这是一个好兆头到目前为止。我尝试过签名和无符号乘法,但似乎没有任何工作。不幸的是,我不能使用双字,因为我没有合适的软件,以下是我的程序:

INCLUDE io.h

Cr        EQU  0DH       ; carriage return
Lf        EQU  0AH       ; line feed

TheStack  SEGMENT STACK
          DW   100H DUP (?)
TheStack  ENDS

Data      SEGMENT
a     Dw ?
b     Dw  ?
c     Dw  ?
d         Dw  ?
f         Dw  ?
g         Dw  ?
h         Dw  ?
e     dw   '2'
Int1      db   6 DUP (?), 0
Int2      db   6 DUP (?), 0
SUM       Db   6 DUP (?), 0
Int3      Db   6 DUP (?), 0
Prompt1   DB   'Please enter the height:  ', 0
Prompt2   DB   Cr, Lf, 'Enter the width:  ', 0
Prompt3   DB   Cr, Lf, 'Enter the length:  ', 0
String    DB   40 DUP (?)
Label1    DB   Cr, Lf, 'The sum is '
result1   DB   10 DUP (?), 0

Data      ENDS

Code      SEGMENT
          ASSUME Cs:Code, Ds:Data

Start:    Mov Ax, SEG Data    ; Load Data Segment Number.
          Mov Ds, Ax

Prompt:   Output Prompt1      ; Prompt for first number.
          Inputs String, 40   ; Read the ASCII characters.
          AToI String         ; Convert ASCII to Integer.
          Mov a, ax; Store first number.
          Output Prompt2      ; Prompt for second number.
          Inputs String, 40   
          AToI String
          Mov b, dx ; Store second number. 
          Mul dx; Add second number.
      mov d, ax
      itoa result1, ax
      output result1  
          Output Prompt3
      Inputs String, 40   
          AToI String
          Mov c, Dx ; Store second number
      Mul dx; Add second number.
      mov f, dx
      output f
      Mov b, dx
      Mov c, ax
      mul dx
      mov g, ax
      ATOI g
          mov g, ax
      ATOI f
          mov f, ax
      ATOI d
          mov d, ax
      add ax, f
      add ax, g
      mov h, ax
      output h
      AToI e
      mov e, ax
      mov h, dx
      mul dx
      itoa result1, ax
      output result1  


Quit:     Mov Al, 0           ; Put return code of zero in Al.
          Mov Ah, 4CH         ; Put DOS function call in Ah.
          int 21H             ; Call DOS

Code      ENDS
          END  Start

我为代码中的错误解释道歉,因为我已经从之前的程序中复制了它的jist。现在我不明白的是一些完美定义的变量如何返回不正确的值。我甚至改变了变量,但我还没有运气。这既令人困惑又烦人。换句话说,当我尝试乘以1倍1时,返回的值是402,这是关闭的!我是汇编编程的新手,所以我相信这部分原因是由于缺乏经验。我的问题是,当这个无错误的程序看起来正确地组合在一起并多次检查错误时,它如何最终返回错误值?有缺失的部分吗?我需要完全重写它吗?这是模拟器的错吗?什么是代码错误导致看起来像一个完美的程序不能正常工作?

1 个答案:

答案 0 :(得分:0)

从我看到的情况来看,一个盒子有6个边,每个边有2个相同的尺寸:

2平方x乘y
2平方x乘z
z方形2平方y 盒子的表面是所有

的总和

所以你只需要:

将输入的长度存储到[side_x],[side_x]和[side_z]。 然后计算所有3对正方形的总和可能看起来像这样(它只是优化了)

start: mov ax,[side_x]          ; side x*y
       mov bx,[side_y]
       mov dx,0
       mul bx
       shl ax,1                 ; 2 times
       mov [box_size],ax

       ; + 2 sides x*z
       mov ax,[side_x]         
       mov bx,[side_z]
       mov dx,0
       mul bx 
       shl ax,1
       add ax,[box_size]
       mov [box_size],ax

       ; + 2 sides y*z
       mov ax,[side_y]         
       mov bx,[side_z]
       mov dx,0
       mul bx
       shl ax,1
       add ax,[box_size]
       mov [box_size],ax

然后打印出[box_size],你就完成了

注意:当然这仅在盒子的大小适合16位寄存器(<65536)时才有效,因此乘法的“上部”(在dx中)被忽略