欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

大牛进来帮小弟我把内联汇编改成纯汇编,多谢

更新时间: 2014-01-05 03:16:04 责任编辑: Author_N1

 

大牛进来帮我把内联汇编改成纯汇编,谢谢
大牛进来帮我把内联汇编改成纯汇编,谢谢。

原代码
LONG highoffset = 0, lowoffset = 0;
DWORD sector = 0;
_asm
    {
push eax
push ecx
push edx
mov eax, sector
mov ecx, 512
mul ecx
mov highoffset, edx
mov lowoffset, eax
pop edx
pop ecx
pop eax
}

分别打印lowoffset,highoffset的值。

现在我要修改成纯汇编,传入结构体,值也是有结构体带入的,汇编运算完成后,将结构体数据更新并返回来。

DISKIORQ     STRUC
highoffset     dw      0  ;  传入传出参数
lowoffset      dw      0  ;  传入传出参数
DISKIORQ        ENDS

;函数描述:函数实现对输入参数sector,lowoffset,highoffset运算后,
;并将结果的高低位拆分开后分别存进highoffset,lowoffset并返回给调用者。
Dtmul proc  , ; uses cx,
    sector : DWORD,
    lowoffset : DWORD,
    highoffset : DWORD






    ret   ; 函数返回指令
Dtmul ENDP


请大牛们帮我改改,谢谢大家了。


--参考方法--
首先,你得定义一个指向结构的指针类型:

; typedef

DISKIORQ     STRUCT
  highoffset dd 0  ;  传入传出参数
  lowoffset  dd 0  ;  传入传出参数
DISKIORQ     ENDS

lpDiskIORqStruct typedef ptr DISKIORQ

然后,为了调用,你还得有一个结构的实例(不是前面定义的类型):

.data
  DiskIORq1 DISKIORQ <>  ; instance of DISKIORQ

最后,就是函数了(稍加优化):

Dtmul proc public, sector: dword, lpDiskIORq: lpDiskIORqStruct
  push eax
  push ecx
  push edx
  mov eax,Sector
  mov ecx,lpDiskIORq
  xor edx,edx
  shld edx,eax,9
  shl eax,9
  mov [ecx].DISKIORQ.highoffset,edx
  mov [ecx].DISKIORQ.lowoffset,eax
  pop edx
  pop ecx
  pop eax
  ret
Dtmul endp

调用:

Invoke Dtmul, 1, offset DiskIORq1


--参考方法--
第一步:
先写个C 的函数,传递结构,结果返回结构

内部写内联汇编的代码
保证能正确工作

第二步:
在编译为汇编代码就可以了。

VC输出列表文件,可以生成汇编代码。
其他编译器,也有类似的功能。

上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 03:16:04
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/20236/
本文WWW.DOC100.NET DOC100.NET版权所有。