在C语言中调用汇编语言子程序 程序连接失败

在C语言中调用汇编语言子程序 程序连接失败,第1张

是因为你的c语言编译器是 32 位的 ,而你的汇编语言是 16 位的 ,连接当然有问题,就算没问题也是运行不起来的。

建议你换一个 32 位的汇编编译器 且用32位汇编指令编写 , 不过你得重新学一下 32位的汇编。

另外还有一种方法就是 使用VC 编写C语言 , 在C中直接用内联汇编。代码如下

__stdcall int fun()

{

int a;

__asm{

mov eax, [esi+4];

add eax, [esi+6];

mov a , eax;

}

return a;

}

int main(int argc, char argv[])

{

printf("Hello World!\n");

printf("%d\n",fun());

return 0;

}

就这么两句,值当的单独写一个SUB么,哪里需要这两个行号,就在哪里放上这两句就行了嘛。

如果你非要这么干,就在顶部进行声明。

如果只是在同一个模块中反复调用此SUB,那就把c和r声明为模块级变量:

在模块顶部写:

Private c%, r&

Dim c%, r&

如果是多个模块共用c和r,那就把c和r声明为全局变量:

也是在模块顶部写:

Public c%, r&

其中Private是私有的,模块级的,Public是公有的,工程级的。

在模块顶部写声明时,Dim同Private

补充说明:

能确定变量类型的,尽量指明类型,如果不指明变量类型,默认是Variant型。

如前用到的,%是integer整数型,&是loog长整型。

列数最多也就几千列,所以c肯定在整数型范围内,所以声明为integer型。

行数最多有一百多万行,所以r有可能会超出整数型范围,所以声明为loog型。

DEBUG。

BUG是虫子的意思。以前老师告诉我们就是捉虫子的意思,程序中的"虫子”就是错误或者不完善地方,那么就是程序调试了!

很形象,你以后不会忘记了吧

^_^

这样啊

总结下给你吧:

1

A[地址]

汇编命令

功能:

指令

直接汇编成

机器码

输入到

内存

中。

2

C[源地址范围][目的地址]比较命令

功能:

比较两内存区域中的内容是否相同,若不同则显示其地址和内容。

3

D[地址]

或D[起始地址][目的地址]

转储命令

功能:

以内存映象方式

显示内存

中的信息。

4

E[地址]

[字节串)

修改内存命令

功能:

从指定的地址开始修改内存值。

5

F[地址范围]

[字节或字节串]

填写命令

功能:

将要填写的字节或字节串填入由地址范围指定的

存储器

中。

6

G[=起始地址]

[[

断点

]……]

执行命令

功能:

执行正在调试的程序,当达到断点时停止执行,

并且显示

寄存器

标志和下一条要执行的命令。

7

I[端口地址]

功能:

从指定的

端口

输入并显示(用

十六进制

)的一个字节。

8

L[地址][盘号:][

逻辑

扇区

号][扇区数]

功能:

将一个文件或盘的绝对扇区装入存储器。

9

M[地址范围][起始地址]

数据传送命令

10

N[盘号:

]

[路径]

[文件名]

[扩展名]

功能:

定义 *** 作文件名。

11

O[端口地址][数据]

输出命令

功能:

发送字节到指定的输出端口。

12

P[=地址]

[数据]

进程命令

功能:

将一个

子程序

调用指令,循环指令,

中断指令

或一个重复

字符串

指令,停止在下一条指令上。

13

Q

退出命令。

14

R[寄存器]

寄存器命令

15

S[地址范围]

[字符串]

功能:

在指定的地址范围内查找给定的字符串。

16

T[=地址][指令条数]

跟踪命令

17

U[起始地址]或者[地址范围]

功能:

将内存中的内容转换为汇编语句。

18

W[地址]

[盘符:]

[起始扇区]

[扇区数]

写盘命令

功能:

将修改过的数据写到

磁盘

上。

说明:

可以将指定

内存地址

开始的数

19

"XD"命令:释放EMS内存

20"XM"命令;把扩充内存上的内存页区映射到主内存区

21"XS"命令:显示当前EMS使用情况。

在汇编语言程序调试的DEBUG环境中,有三个执行指令的命令:

T命令:单步执行,每次只执行一条代码语句,遇到子程序后进入子程序逐条执行指令;

P命令:类似T命令,若有子程序,直接执行完子程序全部指令而不是逐条执行指令,在遇到循环指令时,会直接执行至CX递减至0;

G命令:多步执行,可以跟地址和断点,即格式为 G[=address] [breakpoints],运行到[breakpoints]指定位置的指令后暂停,若不加参数则从当前IP运行到程序结束。

了解必要的调试技巧是有效开发的保证,keil提供的调试模式很强大,有软件仿真及硬件仿真,

进入DEBUG模式,有几个快捷键在很多IDE环境都是通用的

如F5 全速运行

F10 单步跟踪

F11 进入子函数内部 ,子函数这里应该你所说的子程序了

F9 设置断掉,即运行到此位置,例如用在进入中断服务函数及跳出延时函数是基本的方式

你有许多错,自己对比一下:

Private Sub Command1_Click()

Dim i, a, b, c As Integer

For i = 1 To 10

a = Val(InputBox("请输入自然数", "窗口"))

If a Mod 2 Then

b = b + 1

Else

c = c + 1

End If

Next

DebugPrint "b ="; b, "c ="; c

End Sub

以上就是关于在C语言中调用汇编语言子程序 程序连接失败全部的内容,包括:在C语言中调用汇编语言子程序 程序连接失败、vba主过程无法使用在子过程中被更改过的变量值,怎么办、DEBUG命令对应的英文单词都是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9870359.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存