当前位置: 代码迷 >> 汇编语言 >> 大牛进来帮小弟我把内联汇编改成纯汇编,多谢
  详细解决方案

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

热度:175   发布时间:2016-05-02 04:45:58.0
大牛进来帮我把内联汇编改成纯汇编,谢谢
大牛进来帮我把内联汇编改成纯汇编,谢谢。

原代码
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输出列表文件,可以生成汇编代码。
其他编译器,也有类似的功能。

  相关解决方案