xxx.asm:

  1. %define p1 ebp+8
  2. %define p2 ebp+12
  3. %define p3 ebp+16
  4. section .text
  5. global dllmain
  6. dllmain:
  7. mov eax,1
  8. ret 12
  9. aat:
  10. push ebp
  11. mov ebp,esp
  12. ; 函数必须保留所有寄存器,但eaxecxedx除外
  13. ; esp则必须根据调用约定进行更新
  14. mov ecx,[p1] ; array ptr
  15. mov edx,[p2] ; index
  16. mov eax,[p3] ; size
  17. mul edx ; eax=eax*edx
  18. lea eax,[ecx+eax]
  19. mov esp,ebp
  20. pop ebp
  21. ret 12

c++:

  1. #include <iostream>
  2. #include <Windows.h>
  3. typedef PVOID (CALLBACK* aat_t)(PVOID pArray, size_t index, size_t size);
  4. aat_t aat;
  5. struct Player
  6. {
  7. size_t id;
  8. DWORD hp;
  9. DWORD mp;
  10. };
  11. int main()
  12. {
  13. HMODULE myDLL = LoadLibraryA("xxx.dll");
  14. aat = (aat_t)GetProcAddress(myDLL, "aat");
  15. int a[] = { 1,2,3 };
  16. printf("%d\n", *(int*)aat(a, 2, sizeof(int))); // 3
  17. Player b[] = {
  18. Player{1, 10, 20},
  19. Player{2, 50, 60},
  20. Player{3, 90, 20},
  21. };
  22. Player* it = (Player*)aat(b, 0, sizeof(Player));
  23. printf("[%d]: %d %d\n", it->id, it->hp, it->mp); // [1]: 10 20
  24. it = (Player*)aat(b, 1, sizeof(Player));
  25. printf("[%d]: %d %d\n", it->id, it->hp, it->mp); // [2]: 50 60
  26. it = (Player*)aat(b, 2, sizeof(Player));
  27. printf("[%d]: %d %d\n", it->id, it->hp, it->mp); // [3]: 90 20
  28. return 0;
  29. }

nasm aat函数 x86的更多相关文章

  1. nasm astrspn函数 x86

    xxx.asm %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export ast ...

  2. nasm astrcspn函数 x86

    xxx.asm %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export ast ...

  3. nasm astrchr函数 x86

    xxx.asm: %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export as ...

  4. nasm astrlen函数 x86

    xxx.asm %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export ast ...

  5. nasm astrstr函数 x86

    xxx.asm: %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export as ...

  6. nasm astrset_s函数 x86

    xxx.asm %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export ast ...

  7. nasm astrrev函数 x86

    xxx.asm %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export ast ...

  8. nasm astrrchr函数 x86

    xxx.asm %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export ast ...

  9. nasm astrncmp函数 x86

    xxx.asm: %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export as ...

随机推荐

  1. xftp 提示无法显示远程文件夹

    在用xftp远程服务器,打开文件夹的时候一直提示"无法显示远程文件夹" 解决方案: 1.网上大多解决方案是文件->属性->选项->将使用被动模式选项去掉即可 2. ...

  2. LOJ10096掠夺计划

    题目传送门:https://loj.ac/problem/10096 ----------------------------------------------------------------- ...

  3. Java模板引擎Freemarker

    Java模板引擎Freemarker 1.取值(插值)指令 2.逻辑指令:if.switch 3.字符串.集合操作 4.自定义函数 5.list排序内建函数.常用指令 6.自定义指令 7.freema ...

  4. Java,面试题,简历,Linux,大数据,常用开发工具类,API文档,电子书,各种思维导图资源,百度网盘资源,BBS论坛系统 ERP管理系统 OA办公自动化管理系统 车辆管理系统 各种后台管理系统

    Java,面试题,简历,Linux,大数据,常用开发工具类,API文档,电子书,各种思维导图资源,百度网盘资源BBS论坛系统 ERP管理系统 OA办公自动化管理系统 车辆管理系统 家庭理财系统 各种后 ...

  5. Linux 调整系统时间偏差

    在使用Linux系统部署项目,有时会出现时间跟当前时间不一致的情况,这个时候需要做些调整: 1.首先删除之前设置的时区 rm -rf /etc/localtime 2.创建上海时区 ln -s /us ...

  6. JVM之堆参数

    1.Java 7和Java 8区别 Java 7堆结构 JDK 1.8之后将最初的永久代取消了,由元空间取代. 在Java8中,永久代已经被移除,被一个称为元空间的区域所取代.元空间的本质和永久代类似 ...

  7. ACM 模板库

    Template For ACM 一. 字符串 标准库 sscanf sscanf(const char *__source, const char *__format, ...) :从字符串 __s ...

  8. 2015 Multi-University Training Contest 1(7/12)

    2015 Multi-University Training Contest 1 A.OO's Sequence 计算每个数的贡献 找出第\(i\)个数左边最靠右的因子位置\(lp\)和右边最靠左的因 ...

  9. centos 7下安装配置Supervisor

    1.安装Supervisor centos下安装yum install supervisor 2. systemctl enable supervisord 开机自启 systemctl start ...

  10. ansible的Ad-hoc命令

    本文主要介绍了ansible的Ad-hoc命令. Ansible提供两种方式去完成任务,一是 ad-hoc 命令,一是写 Ansible playbook.前者可以解决一些简单的任务, 后者解决较复杂 ...