在win32 asm中了解intel浮点运算

news/2025/1/3 7:35:24/

看老罗的书中有如下一段,

......

        fild    dwRadius
        fild    _dwDegree
        fldpi
        fmul            ;角度*Pi
        fild    dwPara180
        fdivp    st(1),st    ;角度*Pi/180
        fsin            ;Sin(角度*Pi/180)
        fild    _dwRadius
        fmul            ;半径*Sin(角度*Pi/180)

......

    这些指令看上去很陌生;初步看了一下,这些是Intel汇编的浮点运算指令,其中的st是,St0 到 St7 是 8个浮点栈寄存器;

它有一个过程,传入2个数值进行计算,计算后把结果存入eax,然后返回;

先单独做程序看一下它的浮点运算的这个子过程;

先做ftest.rc,

#include		<resource.h>#define	DLG_MAIN		1
#define	IDC_COUNT		101DLG_MAIN DIALOG 50, 50, 113, 40
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "例子"
FONT 9, "宋体"
{LTEXT "", IDC_COUNT, 62, 16, 40, 10
}

     定义一个对话框,其中只有一个静态文本控件,控件ID为IDC_COUNT,用来显示计算结果;

asm代码,先把它的,

_CalcY        proc    _dwDegree,_dwRadius

......

_CalcY        endp

这个子过程加入;

此过程需要在.const段定义2个常量,

    dwRadius                    dw            75
    dwPara180    dw    180

然后在对话框过程的WM_INITDIALOG消息处理分支中,调用_CalcY过程,
            invoke    _CalcY,45,20

调用了之后计算结果在eax中,然后调用SetDlgItemInt函数显示eax中的内容;
            invoke    SetDlgItemInt,hWnd,IDC_COUNT,eax,FALSE

最终的asm代码如下;

.386
.model flat, stdcall
option casemap :noneinclude D:\masm32\include\windows.inc
include D:\masm32\include\user32.inc
include D:\masm32\include\kernel32.inc
include D:\masm32\include\gdi32.inc
includelib D:\masm32\lib\user32.lib
includelib D:\masm32\lib\kernel32.lib
includelib D:\masm32\lib\gdi32.libDLG_MAIN	equ	1
IDC_COUNT             equ           101.data? 
hInstance	dd	? .const
dwRadius	                dw            75
dwPara180	dw	180.code_CalcY		proc	_dwDegree,_dwRadiuslocal	@dwReturnfild	dwRadiusfild	_dwDegreefldpifmulfild	dwPara180fdivp	st(1),stfcosfild	_dwRadiusfmulfsubp	st(1),stfistp	@dwReturnmov	eax,@dwReturnret_CalcY		endp_ProcDlgMain	proc	uses ebx edi esi hWnd,wMsg,wParam,lParammov	eax,wMsg.if	eax == WM_CLOSEinvoke	EndDialog,hWnd,NULL.elseif	eax == WM_INITDIALOGinvoke	_CalcY,45,20invoke	SetDlgItemInt,hWnd,IDC_COUNT,eax,FALSE.elseif	eax == WM_COMMAND.elsemov	eax,FALSEret.endifmov	eax,TRUEret_ProcDlgMain	endpstart:invoke	GetModuleHandle,NULLmov	hInstance,eaxinvoke	DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULLinvoke	ExitProcess,NULLend	start

构建运行如下;

 

invoke    _CalcY,45,20,改为 invoke    _CalcY,90,20,再构建一次,运行如下;

 

 

 


http://www.ppmy.cn/news/849380.html

相关文章

电源越来越“绿”安森美半导体展示高能效解决方案

文章来源于龙人工作室 近年来&#xff0c;世界各地乃至中国都越来越关注、并推动着“绿色电源”的发展。 对于电源而言&#xff0c;既要充分利用电能&#xff0c;又要尽可能地减少不必要的电能消耗或损耗。作为备受业界瞩目的“节电王”&#xff0c;安森美半导体的汽车及电…

CustomProperty

目录 1 CustomProperty 1.1 OnValueChanged 1.2 ObjectSource 1.3 PropertyInfos CustomProperty OnValueChanged protected void OnValueChanged() {

DAY45:动态规划(五)背包问题:01背包理论基础+二维DP解决01背包问题

文章目录 背包问题大纲01背包01背包暴力解法01背包二维DP解法二维DP数组的解法DP数组含义递推公式初始化二维DP数组&#xff08;比较重要&#xff09;遍历顺序&#xff08;比较重要&#xff09; 二维DP数组完整版思路总结返回值为什么是二维数组最后一个元素DP推导过程与数组含…

微信朋友群自动点赞

我一直都不太喜欢给别人点赞&#xff0c;某一年(貌似是17年)微信出了一次朋友圈年报&#xff0c;那一整年我就点出去了几个赞&#xff0c;要知道当时我微信好友应该有300。我觉得这是我不喜欢参与社交活动在网络世界的一种体现吧。不给别人点赞也没啥坏处&#xff0c;但你不评不…

微信评论测试点

功能 1.点击发表评论能否正常弹出输入框&#xff0c;输入框内是否显示默认文字&#xff1b; 2.正常评论的输入内容限制&#xff08;中文&#xff0c;英文&#xff0c;数字&#xff0c;字符等&#xff09;&#xff0c;能否输入特殊字符&#xff0c;表情&#xff0c;图片&#x…

微信打字的隐藏鸿蒙系统,为什么有些人微信聊天只打字不发语音?

我就是这种人&#xff0c;简单从我的角度分析一下。 1&#xff0c;同样一个意思。文字比语音意思更容易表达清楚&#xff0c;“阅读”时间更短。对于接收方体验更好。 2&#xff0c;大家都碰到过60秒语音。对于接收方有多痛苦不言而喻。我不喜欢&#xff0c;别人肯定也不喜欢。…

微信推出“腾讯电子签”具有提醒对方还钱

有没有过这种尴尬&#xff0c;借人钱之后&#xff0c;不好意思开口要回来。别急&#xff0c;试试这个催收不用自己来。其实是一个名为【腾讯电子签】的小程序&#xff0c;主要用于管理各种收据、双方签订租房合同等等。据说&#xff0c;这个功能在朋友间借款的时候&#xff0c;…

1v1微信聊天测试点

1v1微信聊天测试点 在不同的测试策略的维度上进行分析 1 UI角度 ui是否符合需求是否美观 2 功能角度 2.1 入口 聊天界面的入口 2.2 出口 聊天界面的出口 2.3 发送信息 发送纯文字&#xff0c;图片&#xff0c;文件&#xff0c;表情&#xff0c;语音、视频,文字表情消息…