首页
社区
课程
招聘
浮点运算指令一例(用海伦公式计算三角形的面积)
发表于: 2006-3-10 14:46 10271

浮点运算指令一例(用海伦公式计算三角形的面积)

jhlqb 活跃值
10
2006-3-10 14:46
10271

下面是关于浮点运算指令方面的一例,程序对三角形的面积和周长进行了计算!!!
.386
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitive

include m1.inc

.code

start:

        invoke GetModuleHandle,NULL
        mov                hInstance,eax

    invoke InitCommonControls
        invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
        invoke ExitProcess,0

;########################################################################

DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

        mov                eax,uMsg
        .if eax==WM_INITDIALOG

        .elseif eax==WM_COMMAND
             .if wParam==IDC_OK
                     invoke GetDlgItemText,hWin,IDC_A,addr lpA,sizeof lpA ;得到边长a
                     invoke FpuAtoFL,addr lpA,0,DEST_FPU;转化为数值
                     invoke GetDlgItemText,hWin,IDC_B,addr lpB,sizeof lpB
                     invoke FpuAtoFL,addr lpB,0,DEST_FPU
                     invoke GetDlgItemText,hWin,IDC_C,addr lpC,sizeof lpC
                     invoke FpuAtoFL,addr lpC,0,DEST_FPU
                fld st(0)    ;判定所输入数据是否是三角形
                fld st(2)
                fadd
                fcomp st(3)
                fstsw  ax       ; 将状态字保存
                and eax,100000000B  ;;测试状态字的第9位,若为1则说明两边之和小于了第三边
                jnz ErrorHandle                        fld st(0)
                fld st(3)
                fadd
                fcomp st(2)
                fstsw  ax
                and eax,100000000B
                jnz ErrorHandle       
                fld st(1)
                fld st(3)
                fadd
                fcomp st(1)
                fstsw  ax
                and eax,100000000B
                jnz ErrorHandle           ;判定结束
                fadd ;边长相加
                     fadd ;边长相加
                     invoke FpuFLtoA,0,4,addr lpL,SRC1_FPU or SRC2_DIMM
                     invoke SetDlgItemText,hWin,IDC_L,addr lpL
                     fild LTWO
                     fdiv
                     fld st(0)
                     invoke FpuAtoFL,addr lpA,0,DEST_FPU
                     fsub
                     fld st(1)
                     invoke FpuAtoFL,addr lpB,0,DEST_FPU
                     fsub
                     fld st(2)
                     invoke FpuAtoFL,addr lpC,0,DEST_FPU
                     fsub
                     fmul
                     fmul
                     fmul
                     fsqrt
                     invoke FpuFLtoA,0,4,addr lpS,SRC1_FPU or SRC2_DIMM
                     invoke SetDlgItemText,hWin,IDC_S,addr lpS
                     ret
                     ErrorHandle:
                     invoke MessageBox,hWin,addr lpMessage,NULL,MB_OK and MB_ICONERROR
                     ret

             .endif
        .elseif eax==WM_CLOSE
                invoke EndDialog,hWin,0
        .else
                mov                eax,FALSE
                ret
        .endif
        mov                eax,TRUE
        ret

DlgProc endp

end start

下面是inc文件的内容;

include windows.inc
include kernel32.inc
include user32.inc
include Comctl32.inc
include shell32.inc
include fpu.inc
includelib fpu.lib
includelib kernel32.lib
includelib user32.lib
includelib Comctl32.lib
includelib shell32.lib

DlgProc                        PROTO        :HWND,:UINT,:WPARAM,:LPARAM

.const

IDD_DIALOG1                        equ 101
IDC_A                                equ 1003
IDC_B                                equ 1004
IDC_OK                                equ 1005
IDC_C                                equ 1006
IDC_S                                equ 1008
IDC_L                                equ 1010
LTWO dw 2
lpMessage db "不是三角形",0
;#########################################################################
.data?
hInstance                        dd ?
lpA db 10 dup(?)
lpB db 10 dup(?)
;#########################################################################
lpC db 10 dup(?)
lpL db 10 dup(?)
lpS db 10 dup(?)
附件是全部的源程序!!!


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (8)
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好,不错,
2006-3-11 10:46
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我是新手不知道从哪里开始学好
2006-3-11 11:38
0
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
4
不错,另外想请教楼主一个问题:从哪里能得到一些

浮点指令集的介绍?多谢了……^-^
2006-3-11 11:39
0
雪    币: 289
活跃值: (236)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
5
可以去看看MASM所带的帮助文件,不过是英文的
2006-3-12 09:15
0
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
6
To:楼上
多谢了^-^
2006-3-12 19:33
0
雪    币: 202
活跃值: (122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主可不可以把程序完善一下,最好是教下我怎么做(到哪里去查找这通用控件编程方面的资料,我查 Win32 API 的“Edit Controls”节的时候,竟然没有相关的 API,-_-!!!),比如,边长只能输入数字,并且不能超过 10 位;面积、周长编辑框是只读的;另外,如果输入一个有效的边长,比如3、4、5,连按 5 下“OK”键,会弹出“不是三角形”对话框出来,我用OD调的时候又不出来 :( ,楼主可不可以看下,然后告诉我为什么?
2006-3-14 16:13
0
雪    币: 234
活跃值: (370)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
8
支持.多发源码
2006-3-14 16:57
0
雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
呵呵...前几天在google上找到了一个
2006-3-16 21:45
0
游客
登录 | 注册 方可回帖
返回
//