VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 2290|回复: 6

X64下 VS2015的内联汇编问题

[复制链接]
85_avatar_middle
最佳答案
3 
在线会员 发表于 2020-7-16 10:47:55 | 显示全部楼层 |阅读模式
在X86平台下 编译器可以进行内联汇编,比如这两个  32位的in  out命令
ULONG In_32 (PULONG Port)
{
   ULONG Value;
        __asm
        {
                mov edx, Port
                in eax, dx
                mov Value, eax
                //插入几个空指令
                nop
                nop
        }
   return(Value);
}

void Out_32(PULONG Port,ULONG Value)
{
        __asm
        {
                mov edx, Port
                mov eax, Value
                out dx,eax
                //插入几个空指令
                nop
                nop
        }
}

现在用64平台编译器 必须把格式写成下面这种格式编译器才认识
.CODE

int_3 PROC
        int 3
        ret
int_3 ENDP

END
求最上面2个in  out 32位读写端口 如何改才能在64平台下运行?




上一篇:关于WinMain的参数说明
下一篇:无法解析外部符号和外部命令该如何修改
70_avatar_middle
最佳答案
49 
在线会员 发表于 2020-7-16 15:11:56 | 显示全部楼层
我记得vs好像不支持64位内联汇编,得单写个asm文件,然后再c里边调用汇编的函数
01_avatar_middle
最佳答案
41 
online_admins 发表于 2020-7-16 16:22:44 | 显示全部楼层
VS2015默认不支持x64下__asm{}内联汇编的解决方案(含资源共享)
https://blog.csdn.net/jfsufeng/article/details/86238507

VS编译64位汇编时报错:error C4235: 使用了非标准扩展: 不支持在此结构上使用“_asm”关键字
https://blog.csdn.net/ab7253957/article/details/50622801

VS2010 X64汇编(使用了非标准扩展: 不支持在此结构上使用“_asm”关键字解决方法)
https://blog.csdn.net/ab7253957/article/details/50471246
85_avatar_middle
最佳答案
3 
ico_lz  楼主| 发表于 2020-7-16 20:20:27 | 显示全部楼层
本帖最后由 tjzoo111 于 2020-7-16 20:24 编辑

感谢上面2位 可能我描述有点问题. 我的问题不是 64位写内联汇编的问题  这个问题已经搞定了 已经能执行 int_3这个中断函数

下面这个int_3中断格式就是64位要求的汇编格式   但是没有像上面2个这样有带参数,返回类型,在64位中各种寄存器偏移不知道怎么偏   ;现在已经在看王爽的书学习了
.CODE
int_3 PROC
        int 3
        ret
int_3 ENDP
END

out_32程序修改为后 出现问题

out_32 PROC ,n1:PULONG,n2:ULONG
        push                dx
        mov                edx, n1   //这一句卡住了  查看内存发现里面没有值   这明显是参数传递出错了 esp寄存器偏移也用不来
        mov                eax, n2
        out                dx, eax
        pop                dx
        ret
out_32 ENDP



85_avatar_middle
最佳答案
3 
ico_lz  楼主| 发表于 2020-7-16 20:31:00 | 显示全部楼层
本帖最后由 tjzoo111 于 2020-7-16 23:14 编辑

然后在修改
.CODE

out_32 proc ,n1:DWORD,n2:DWORD
        push                dx
        mov                edx, n1  
        mov                eax, n2
        out                dx, eax
        pop                dx
        ret
out_32  endp

END
然后查手册
OUT DX, EAX  将 EAX 中的双字输出到 DX 中的 I/O 端口地址      
发现参数填反了 继续修改
.CODE

out_32 proc ,n1:DWORD,n2:DWORD
        push                dx
        mov                edx, n2  
        mov                eax, n1
        out                dx, eax
        pop                dx
        ret
out_32  endp

END
测试发现这种自带参数 还要计算偏移 不知道规则好麻烦
直接改为
out_32 proc
        mov                eax, dword ptr [rsp+60H]
        mov                edx, dword ptr [rsp+64h]
        out                dx, eax
        ret
out_32 endp
85_avatar_middle
最佳答案
1 
在线会员 发表于 2020-7-17 11:42:41 | 显示全部楼层
曲线救国,使用VS2019 超级香~

点评

VS2019走 adobe路线了 开始界面超酷超炫  发表于 2020-7-19 12:23
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-9-29 15:06

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表