+ -
当前位置:首页 → 问答吧 → 真心请教一个16位系统下的汇编问题

真心请教一个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,不过改完以后还是会死机。

作者: zhajianming   发布时间: 2011-11-14

nt架构下不允许应用程序直接访问端口的
如果懒得改,去找个可以在应用程序下访问端口的软件吧,忘了名字了

作者: Areslee   发布时间: 2011-11-15