所以我刚开始在Assembly中编码,我正在尝试创建一个简单的程序,用输入的x和y来计算表达式。但是,当我在64位win8上使用TASM编译我的代码时,我得到1 Operands Types do not Match
的错误。我不确定这意味着什么;据我所知,这意味着2个值的类型不同。但我该如何解决呢?
x,y,z是整数
; eval z := (3 - 2*x)*x - 2*y + 1;
; z :=(3 - 2*x)
mov al, '2'
mul x
sub ax, '3'
mov z, ax
; eval z := z * x - 2
sub x, '2'
mul z
mov z, ax
; eval z := z* y + 1
mov al, '1'
add al, y ; error occurs here
mul z
mov z, ax
我已修改了我的程序,并尝试使用3x-2x^2 -2y +1 =(3 - 2*x)*x - 2*y + 1
这一事实使其更简单一些。但我仍然遇到x ^ 2部分的问题。我不知道如何正确实施imul,因此我认为我得到了不希望的结果。我怎么做x * x才能用imul模拟x ^ 2?据我所知,结果是在ax中,被乘数在al。但是我如何将x移动到al(x是一个int而al是字节右)?
; eval z := 3x-2x^2 -2y +1 =(3 - 2*x)*x - 2*y + 1;
mov ax, x
add ax, ax
add ax, x
mov cx, ax
mov bx, x
imul bx ;x^2
add ax, ax ; where ax is the result of the imul
sub cx, bx
mov ax, cx
mov bx, y
add bx, bx
inc bx
sub ax, bx
mov z, ax
答案 0 :(得分:1)
; eval z := (3 - 2*x)*x - 2*y + 1;
; z :=(3 - 2*x)
mov aX, x
ADD AX,AX ;X*2 - much faster than MUL
sub ax, 3 ;note 3 not '3' as '3' is the ASCII character '3' = 33hex
;result is 2x-3, not 3-2x! (not fixed!!)
mov z, ax
; eval z := z * x - 2
:: ! No - the expression required is z := (3 - 2*x)*x - (2*y) + 1
sub aX, x ;Need word-size
mul z
mov z, ax
; eval z := z* y + 1
add y, 1 ; NOT ascii - decimal (what about INC?)
mov aX, y ;need word-size
mul z
mov z, ax
这应该可以修复你的语法错误 - 并提供一些我尚未修复的其他问题的指示。
请注意,表达式(3 - 2*x)*x - 2*y + 1
为(3 - 2*x)*x - (2*y) + 1
我不确定您是否可以解决此问题
(3 - 2*x)*x - (2*y) + 1 = 3x-2x^2 -2y +1
或者你是否必须使用常数并以机械方式处理它。
无论如何,您需要非常小心3-2x
表达式。密切关注结果的sign
。 x
或y
可以是否定的?这也可能改变你的想法。
所以 - 整体:
非常确定您需要评估的表达式
'4'是ASCII 4,而不是十进制4
AX用于字大小变量(16位)AL用于字节大小。
注意否定论点或中间结果的可能性
ADD AX,AX
如果比MUL
快2倍
INC比ADD xx,1
你真的确定X
和y
- 他们可能不需要[x]
和[y]
吗? (可能取决于你的汇编程序模式)