2010-05-11 125 views
3

请看下面的程序,错误是无效的有效地址计算,我已经提到,线,请告诉我,为什么它的无效的有效地址计算 这里是程序
无效的有效地址计算

[org 0x100] 
jmp start 


array1: dw 10,15,20,25,30,35,40,45,50,55 
array2: dw 15,10,20,35,40,30,55,50,25,45 

start: mov bx,0 
    mov cx,0 
loop: mov ax,[array2+bx] 
     cmp ax,[array1+cx]//here is the error invalid effective address calculation 
     jne NextElementOfArray1 


NextElementOfArray2: add bx,2 
         cmp bx,20  
      je end 
         mov cx,0 
      jmp loop 


NextElementOfArray1: add cx,2   
         cmp cx,20  
      je NextElementOfArray2 
      jmp loop 
end: mov ax,0x4c00 
    int 0x21 
+0

cx分配在哪里?你分配了ax和dx。 cx的价值是什么? – Shaihi 2010-05-11 08:43:08

+0

我已经进行了更正,请现在检查 – 2010-05-11 08:49:32

回答

9
start: mov bx,0 
     mov dx,0 ; <-- did you mean "mov cx, 0" ? 
loop: mov ax,[array2+bx] 
     cmp ax,[array1+cx] 

编辑:如果我没记错,cx寄存器不能用作索引。

Table 2-1. 16-Bit Addressing Forms with the ModR/M Byte

Effective Address Mod R/M Value of ModR/M Byte (in Hexadecimal) 

[BX+SI] 
[BX+DI] 
[BP+SI] 
[BP+DI] 
[SI] 
[DI] 
[BX] 
[BX+SI]+disp8 
[BX+DI]+disp8 
[BP+SI]+disp8 
[BP+DI]+disp8 
[SI]+disp8 
[DI]+disp8 
[BP]+disp8 
[BX]+disp8 
[BX+SI]+disp16 
[BX+DI]+disp16 
[BP+SI]+disp16 
[BP+DI]+disp16 
[SI]+disp16 
[DI]+disp16 
[BP]+disp16 
[BX]+disp16 
+0

ya ya我的意思是mov cx,0 – 2010-05-11 08:45:47

+0

我应该在这里使用哪个注册表 – 2010-05-11 08:53:02

+0

@Zia,我发布了英特尔手册中的有效索引列表。不要忘记下载并检查出来。 – 2010-05-11 09:05:59

0

更容易记住以下公式(为TASM)地址规范:

[BX|BP]+[SI|DI]+constant 

凡|表示OR(意味着BX和BP不能在相同的地址规范中)。常数可以是变量或数字常量。