大牛进来帮我把内联汇编改成纯汇编,谢谢。
原代码
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输出列表文件,可以生成汇编代码。
其他编译器,也有类似的功能。