是因为你的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命令对应的英文单词都是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)