读书人

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

发布时间: 2013-12-20 00:23:10 作者: rapoo

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

原代码
LONG highoffset = 0, lowoffset = 0;
DWORD sector = 0;
_asm
{
push eax
push ecx
push edx
mov eax, sector
mov ecx, 512
mulecx
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输出列表文件,可以生成汇编代码。
其他编译器,也有类似的功能。

读书人网 >汇编语言

热点推荐