操作数类型不匹配 - 汇编代码

时间:2015-02-25 02:02:36

标签: assembly

所以我刚开始在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

1 个答案:

答案 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表达式。密切关注结果的signxy可以是否定的?这也可能改变你的想法。

所以 - 整体:

非常确定您需要评估的表达式

'4'是ASCII 4,而不是十进制4

AX用于字大小变量(16位)AL用于字节大小。

注意否定论点或中间结果的可能性

ADD AX,AX如果比MUL快2倍

INC比ADD xx,1

更短,更快

你真的确定Xy - 他们可能不需要[x][y]吗? (可能取决于你的汇编程序模式)