哦,小男孩......我从哪里开始?我尝试过第二次来获得一个简单的程序来计算一个盒子的表面积(只有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,这是关闭的!我是汇编编程的新手,所以我相信这部分原因是由于缺乏经验。我的问题是,当这个无错误的程序看起来正确地组合在一起并多次检查错误时,它如何最终返回错误值?有缺失的部分吗?我需要完全重写它吗?这是模拟器的错吗?什么是代码错误导致看起来像一个完美的程序不能正常工作?
答案 0 :(得分:0)
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中)被忽略