真心请教一个16位系统下的汇编问题
时间:2011-11-14
来源:互联网
下面这段代码是运行在windows98下的代码,VC中嵌入汇编语言来做数据采集的。
现在想把这个移植到32位的xp操作系统中,程序会崩溃,跟踪调试走到 JNE LLL 这句程序就会崩溃。
求教这段代码如何能移植到xp下正常运行,谢谢!
void newSignalIn(double*x0,double *x1,double *x2,double*x3,double*x4)
{
#define newFreqCount 0x50 //0.02ms
#define newChannel 5
int n0,n1,n2,n3,n4;
_asm{
//initial ad
MOV DX,address
MOV AL,0x10 //inquiry cycle mode FROM_0_CHANNELL
OUT DX,AL
//set frequency
MOV DX,address
ADD DX,7
MOV AL,0x34
OUT DX,AL
MOV DX,address
ADD DX,4
MOV AX,newFreqCount
OUT DX,AL
MOV AL,AH
OUT DX,AL
//set number of channels
MOV DX,address
ADD DX,7
MOV AL,0x74
OUT DX,AL
MOV DX,address
ADD DX,5
MOV AL,newChannel
OUT DX,AL
MOV AL,0
OUT DX,AL
MOV DX,address
IN AL,DX //Start the input
INC DX
INC DX
IN AX,DX //Clear the buffer of ad
//read the five chanel
MOV BL,0x01
//pass over the first six channel
MOV CX,0x05
LL: DEC DX
LLL: IN AL,DX
AND AL,BL
JNE LLL
INC DX
IN AX,DX
MOV n0,AX
DEC CX
JNZ LL
DEC DX
L0: IN AL,DX
AND AL,BL
JNE L0
INC DX
IN AX,DX
XCHG AL,AH
AND AX,0xFFF0
SHR AX,4
SUB AX,0x7FF
MOV n0,AX
DEC DX
L1: IN AL,DX
AND AL,BL
JNE L1
INC DX
IN AX,DX
XCHG AL,AH
AND AX,0xFFF0
SHR AX,4
SUB AX,0x7FF
MOV n1,AX
DEC DX
L2: IN AL,DX
AND AL,BL
JNE L2
INC DX
IN AX,DX
XCHG AL,AH
AND AX,0xFFF0
SHR AX,4
SUB AX,0x7FF
MOV n2,AX
DEC DX
L3: IN AL,DX
AND AL,BL
JNE L3
INC DX
IN AX,DX
XCHG AL,AH
AND AX,0xFFF0
SHR AX,4
SUB AX,0x7FF
MOV n3,AX
DEC DX
L4: IN AL,DX
AND AL,BL
JNE L4
INC DX
IN AX,DX
XCHG AL,AH
AND AX,0xFFF0
SHR AX,4
SUB AX,0x7FF
MOV n4,AX
/// now set the ad to wait 2ms.
MOV DX,address
MOV AL,0x30 //interrupt cycle mode FROM_0_CHANNELL
OUT DX,AL
//set frequency
MOV DX,address
ADD DX,7
MOV AL,0x34
OUT DX,AL
MOV DX,address
ADD DX,4
MOV AX,freqcount
OUT DX,AL
MOV AL,AH
OUT DX,AL
//set number of channels
MOV DX,address
ADD DX,7
MOV AL,0x74
OUT DX,AL
MOV DX,address
ADD DX,5
MOV AL,1
OUT DX,AL
MOV AL,0
OUT DX,AL
MOV DX,address
IN AL,DX //Start the input
INC DX
INC DX
IN AX,DX //Clear the buffer of ad
}
*x1=n1;*x2=n2;*x3=n3;*x4=n4;*x0=n0;
////////////////////////////////////
// ERROR:: There's an extra data at the first cycle.
////////////////////////////////////
//SetErrorInterrupt();
}
另外,里面的int在xp应该改为short int,不过改完以后还是会死机。
现在想把这个移植到32位的xp操作系统中,程序会崩溃,跟踪调试走到 JNE LLL 这句程序就会崩溃。
求教这段代码如何能移植到xp下正常运行,谢谢!
void newSignalIn(double*x0,double *x1,double *x2,double*x3,double*x4)
{
#define newFreqCount 0x50 //0.02ms
#define newChannel 5
int n0,n1,n2,n3,n4;
_asm{
//initial ad
MOV DX,address
MOV AL,0x10 //inquiry cycle mode FROM_0_CHANNELL
OUT DX,AL
//set frequency
MOV DX,address
ADD DX,7
MOV AL,0x34
OUT DX,AL
MOV DX,address
ADD DX,4
MOV AX,newFreqCount
OUT DX,AL
MOV AL,AH
OUT DX,AL
//set number of channels
MOV DX,address
ADD DX,7
MOV AL,0x74
OUT DX,AL
MOV DX,address
ADD DX,5
MOV AL,newChannel
OUT DX,AL
MOV AL,0
OUT DX,AL
MOV DX,address
IN AL,DX //Start the input
INC DX
INC DX
IN AX,DX //Clear the buffer of ad
//read the five chanel
MOV BL,0x01
//pass over the first six channel
MOV CX,0x05
LL: DEC DX
LLL: IN AL,DX
AND AL,BL
JNE LLL
INC DX
IN AX,DX
MOV n0,AX
DEC CX
JNZ LL
DEC DX
L0: IN AL,DX
AND AL,BL
JNE L0
INC DX
IN AX,DX
XCHG AL,AH
AND AX,0xFFF0
SHR AX,4
SUB AX,0x7FF
MOV n0,AX
DEC DX
L1: IN AL,DX
AND AL,BL
JNE L1
INC DX
IN AX,DX
XCHG AL,AH
AND AX,0xFFF0
SHR AX,4
SUB AX,0x7FF
MOV n1,AX
DEC DX
L2: IN AL,DX
AND AL,BL
JNE L2
INC DX
IN AX,DX
XCHG AL,AH
AND AX,0xFFF0
SHR AX,4
SUB AX,0x7FF
MOV n2,AX
DEC DX
L3: IN AL,DX
AND AL,BL
JNE L3
INC DX
IN AX,DX
XCHG AL,AH
AND AX,0xFFF0
SHR AX,4
SUB AX,0x7FF
MOV n3,AX
DEC DX
L4: IN AL,DX
AND AL,BL
JNE L4
INC DX
IN AX,DX
XCHG AL,AH
AND AX,0xFFF0
SHR AX,4
SUB AX,0x7FF
MOV n4,AX
/// now set the ad to wait 2ms.
MOV DX,address
MOV AL,0x30 //interrupt cycle mode FROM_0_CHANNELL
OUT DX,AL
//set frequency
MOV DX,address
ADD DX,7
MOV AL,0x34
OUT DX,AL
MOV DX,address
ADD DX,4
MOV AX,freqcount
OUT DX,AL
MOV AL,AH
OUT DX,AL
//set number of channels
MOV DX,address
ADD DX,7
MOV AL,0x74
OUT DX,AL
MOV DX,address
ADD DX,5
MOV AL,1
OUT DX,AL
MOV AL,0
OUT DX,AL
MOV DX,address
IN AL,DX //Start the input
INC DX
INC DX
IN AX,DX //Clear the buffer of ad
}
*x1=n1;*x2=n2;*x3=n3;*x4=n4;*x0=n0;
////////////////////////////////////
// ERROR:: There's an extra data at the first cycle.
////////////////////////////////////
//SetErrorInterrupt();
}
另外,里面的int在xp应该改为short int,不过改完以后还是会死机。
作者: zhajianming 发布时间: 2011-11-14
nt架构下不允许应用程序直接访问端口的
如果懒得改,去找个可以在应用程序下访问端口的软件吧,忘了名字了
如果懒得改,去找个可以在应用程序下访问端口的软件吧,忘了名字了
作者: Areslee 发布时间: 2011-11-15
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28