gpt4 book ai didi

c - C 中的内联 ASM,使用 "-masm=intel": "undefined reference" 使用 MinGW/GCC 编译

转载 作者:行者123 更新时间:2023-12-03 20:22:21 25 4
gpt4 key购买 nike

我一直在寻找使用内联 ASM 的示例,并且看到了一些不同的方法。

我在编译时使用了 -masm=intel 选项。据我了解,使用此选项时,您可以像使用 intel 语法一样编写内联 ASM。

我也见过人们使用“.intel_syntax”的方法

当我编译时,我收到以下消息。

    i586-mingw32msvc-gcc -masm=intel -o KDOS.exe KDOS.c
/tmp/ccVIXhRF.o:KDOS.c:(.text+0x5f): undefined reference to `address'
/tmp/ccVIXhRF.o:KDOS.c:(.text+0x6a): undefined reference to `ipAddr'
/tmp/ccVIXhRF.o:KDOS.c:(.text+0x79): undefined reference to `csAddr'
/tmp/ccVIXhRF.o:KDOS.c:(.text+0x11d): undefined reference to `address'
collect2: ld returned 1 exit status

我四处寻找解决方案,但似乎找不到。我见过线程说你不能将 C 变量传递到内联 ASM,但我也看到一些东西说有变通方法。不过,它们并不完全适用于我正在做的事情,所以我真的不确定该怎么做。对不起,如果这是一个明显的答案,但这是我第一次使用内联 ASM,而不是在转换语法方面胡闹。

这是我的代码。我正在阅读一本书,这是其中的一些示例代码。它没有在书中用 gcc 编译,所以这就是为什么我需要转换为 intel 语法,因为我显然需要它在 Windows 上运行。这是我修改后的代码版本:
// KDOS.c
// Chapter 2

#include<stdio.h>

#define WORD unsigned short

#define IDT_001_ADDR 0 //start address of first IVT vector
#define IDT_255_ADDR 1020 //start address of last IVT vector
#define IDT_VECTOR_SZ 4 //size of each IVT Vector (in bytes)

#define BP __asm{ int 0x3 } //break point

void main()
{
WORD csAddr; //Code segment of given interrupt
WORD ipAddr; //Starting IP for given interrupt
short address; //address in memory (0-1020)
WORD vector; //IVT entry ID (i.e., 0..255)
char dummy; //strictly to help pause program execution

vector = 0x0;

printf("\n---Dumping IVT from bottom up---\n");
printf("Vector\tAddress\t\n");

for
(
address=IDT_001_ADDR;
address<=IDT_255_ADDR;
address=address+IDT_VECTOR_SZ,vector++
)
{
printf("%03d\t%08p\t",vector,address);

//IVT starts at bottom of memory, so CS is alway 0x0

__asm__
(
".intel_syntax;"
"PUSH ES;"
"MOV AX, 0;"
"MOV ES,AX;"
"MOV BX,address;"
"MOV AX,ES:[BX];"
"MOV ipAddr,AX;"
"INC BX;"
"INC BX;"
"MOV AX,ES:[BX];"
"MOV csAddr,AX;"
"POP ES;"
);
printf("[CS:IP]=[%04X,%04X]\n",csAddr,ipAddr);
}

printf("press [ENTER] key to continue:");
scanf("%c",&dummy);

printf("\n---Overwrite IVT from top down---\n");

/*
Program will die somwhere around 0x4*
Note: can get same results via DOS debug.exe -e command
*/

for
(
address=IDT_255_ADDR;
address>=IDT_001_ADDR;
address=address-IDT_VECTOR_SZ,vector--
)
{
printf("Nulling %03d\t%08p\n",vector,address);
__asm__
(
".intel_syntax;"
"PUSH ES;"
"MOV AX,0;"
"MOV ES,AX;"
"MOV BX,address;"
"MOV ES:[BX],AX;"
"INC BX;"
"INC BX;"
"MOV ES:[BX],AX;"
"POP ES;"
);
}
return;
}/*end main()------------------------------------------------------------*/

任何帮助将不胜感激。如果这是显而易见的,我再次道歉。

最佳答案

其实你可以通过C内联参数 asm .但是您必须在 asm 代码部分之后定义它。

在你的情况下,这样的事情可以工作(你应该添加 -masm=intelgcc 的命令行):

asm(
".intel_syntax noprefix;\n\t"
...
"MOV BX,%[address];\n\t"
...
".intel_syntax prefix;\n\t"
:: [address] "m" address, ...
: "AX", "BX", /* all changed registers to inform compiler to save them if needed */
);

请参阅 similar question 中的示例.

关于c - C 中的内联 ASM,使用 "-masm=intel": "undefined reference" 使用 MinGW/GCC 编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15438383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com