Assembly 使用Turbo C++;内联asm 我试图在Turbo C++ 3 IDE中编写16位内联汇编代码。我需要使用内嵌程序集访问像C++这样的高级语言定义的数组,但我的尝试失败了。无法编译的代码: #include<stdio.h> int main() { int array[10] = {1,2,3,4,5,6,7,8,9,0}; asm{ mov ax,array[0] } // fall off the end of the function with return value in AX // Or else C++ implicit return 0 still happens. } #包括 int main() { int数组[10]={1,2,3,4,5,6,7,8,9,0}; asm{ mov-ax,数组[0] } //从函数末尾脱落,返回值为AX /+否则C++隐式返回0仍然会发生。 }

Assembly 使用Turbo C++;内联asm 我试图在Turbo C++ 3 IDE中编写16位内联汇编代码。我需要使用内嵌程序集访问像C++这样的高级语言定义的数组,但我的尝试失败了。无法编译的代码: #include<stdio.h> int main() { int array[10] = {1,2,3,4,5,6,7,8,9,0}; asm{ mov ax,array[0] } // fall off the end of the function with return value in AX // Or else C++ implicit return 0 still happens. } #包括 int main() { int数组[10]={1,2,3,4,5,6,7,8,9,0}; asm{ mov-ax,数组[0] } //从函数末尾脱落,返回值为AX /+否则C++隐式返回0仍然会发生。 },assembly,x86,x86-16,inline-assembly,turbo-c++,Assembly,X86,X86 16,Inline Assembly,Turbo C++,上面的代码在指令mov ax,array[0]中给出了一个错误: 操作码和操作数的组合无效 我尝试通过Turbo C++ 3的手册学习如何复制内容,但是没有关于如何使用内联汇编来做的信息。 我甚至读过8086到奔腾汇编语言的书,但我找不到问题的答案 当我尝试其他方法时,我似乎得到了错误的答案,比如-22,而不是1 (编者按:不清楚OP是使用调试器查看AX,还是只查看main的返回值)访问堆栈上生成的数组元素可能有点棘手。当访问基于堆栈的变量(即:在堆栈上定义的非静态变量,如数组)时,编译器生成与

上面的代码在指令
mov ax,array[0]
中给出了一个错误:

操作码和操作数的组合无效

我尝试通过Turbo C++ 3的手册学习如何复制内容,但是没有关于如何使用内联汇编来做的信息。 我甚至读过8086到奔腾汇编语言的书,但我找不到问题的答案

当我尝试其他方法时,我似乎得到了错误的答案,比如-22,而不是1


(编者按:不清楚OP是使用调试器查看AX,还是只查看
main
的返回值)

访问堆栈上生成的数组元素可能有点棘手。当访问基于堆栈的变量(即:在堆栈上定义的非静态变量,如
数组
)时,编译器生成与寄存器BP相关的内存引用。你的指示:

mov ax,array[0]
将给出一个错误:

操作码和操作数的组合无效

该语法不适用于包括数组在内的堆栈变量。有效的方法是:

mov ax,[array]     ; Get first int in array
mov ax,[array+2]   ; Get second int in array
mov ax,[array+4]   ; Get third int in array
[0]
在内联程序集中的使用不像在C代码中那样有效。您必须计算数组中每个元素的字节地址,因此
[array+2]
指向第二个元素,而
[array+4]
指向数组中第三个元素的原因。开发人员必须根据元素的大小缩放要添加的偏移量。如果
array
char
的数组,则
[array+1]
指向第二个元素,而
[array+2]
指向数组中的第三个元素。使用
long
(32位值)
[array+4]
数组指向第二个元素,
[array+8]
数组指向第三个元素

要访问
int
数组的第三个元素,您的内联程序集可能如下所示:

asm{
    mov ax, [array+4]
};
通常,在处理数组时,您可能需要访问多个元素,或者创建一个循环来对多个元素执行某些操作。在这种情况下,你会考虑将数组的地址加载到像SI1这样的登记器中。一旦获得数组的地址,就可以访问各个元素。获得数组地址后,可以将字节偏移量添加到元素中(
int
,在本例中)并检索值。如果数组的地址位于SI中,则
[SI+0]
(或
[SI]
)是数组中第一个整数的地址

要检索堆栈变量或全局变量的地址,可以使用指令(加载有效地址)。下面的代码使用
LEA
array
的基(元素0)的地址获取到SI中。代码检索第三个整数元素(
array+4
)的值并将其放入AX中。然后,代码使用AX中的值设置另一个变量
myint
。然后,C代码打印该值。示例代码:

#include<stdio.h>
int main()
{
    int array[10] = {1,2,3,4,5,6,7,8,9,0};
    int myint;

    asm{
        lea si, [array]
        mov ax, [si+4]             ; Get third int element from the array
        mov [myint], ax
    };

    printf("Third element: %d\n", myint);
    return 0;
}
#包括
int main()
{
int数组[10]={1,2,3,4,5,6,7,8,9,0};
int-myint;
asm{
lea si,[数组]
mov ax,[si+4];从数组中获取第三个int元素
mov[myint],ax
};
printf(“第三个元素:%d\n”,myint);
返回0;
}
应将其作为输出:

第三要素:3


如果要对数组中的所有整数求和,则内联程序集可以如下所示:

#include<stdio.h>
int main()
{
    int array[10] = {1,2,3,4,5,6,7,8,9,0};
    /* arrsize = number of ints in array */
    const unsigned int arrsize = sizeof(array)/sizeof(int);
    int total;

    asm{
        /* Sum a non-zero length array from the last element down to first element */
        lea si, [array]        /* SI = base address of array */
        mov bx, [arrsize]      /* BX = Number of 16-bit ints in array */
        shl bx, 1              /* BX = BX * 2 = length of array in bytes
                                  BX points at element just beyond the end of the array */
        xor ax, ax             /* AX = current sum = 0 */
    }
    numloop:
    asm{
        add ax, [si+bx-2]      /* Add current element */
        sub bx, 2              /* BX =  position of previous element in array */
        jnz numloop            /* If the index = 0 then we aren't finished */

        mov [total], ax        /* Move the sum into variable total */
    };

    printf("Sum of all ints: %d\n", total);
    return 0;
}
#包括
int main()
{
int数组[10]={1,2,3,4,5,6,7,8,9,0};
/*arrsize=数组中的整数数*/
常量无符号整数arrsize=sizeof(数组)/sizeof(整数);
整数合计;
asm{
/*将长度非零的数组从最后一个元素向下求和到第一个元素*/
lea-si,[array]/*si=数组的基址*/
mov bx,[arrsize]/*bx=阵列中16位整数的数量*/
shl bx,1/*bx=bx*2=以字节为单位的数组长度
BX指向数组末尾之外的元素*/
xor ax,ax/*ax=当前和=0*/
}
numloop:
asm{
添加ax、[si+bx-2]/*添加当前元素*/
sub bx,2/*bx=数组中上一个元素的位置*/
jnz numloop/*如果索引=0,那么我们还没有完成*/
mov[total],ax/*将总和移动到变量total中*/
};
printf(“所有整数之和:%d\n”,总计);
返回0;
}
某些版本的Turbo-C不支持内联汇编语句中的标签。相反,您可以使用通常用于C中的
goto
语句的C标签。您只需将内联部件拆分为多个零件,以便在必要时放置标签,就像上面示例中使用label
numloop
所做的那样

输出应为:

所有整数之和:45


脚注:
  • 1BX、DI和SI是中允许的寄存器。BP也是允许的,但它隐式使用SS作为段而不是DS

没有人记得这一点。你从这个千禧年换成什么怎么样?:)无论如何,请尝试
mov-ax,[array]
。验证生成的汇编代码。或
mov ax,WORD PTR[array]
。还要检查那里的
int
大小,是16位还是32位-bit@Renat:在Turbo-C(Borland)和其他类似的16位编译器中(16位Microsoft,Wa