Win32汇编 MASM函数

题目1:

 ;*【*/
.386
.model flat,stdcall
option casemap:none
include kernel32.inc
includelib kernel32.lib
includelib msvcrt.lib
scanf PROTO C:DWORD,:vararg
printf PROTO C:DWORD,:vararg
.data
x QWORD ?
a QWORD ?
b QWORD ?
d QWORD ?
z QWORD ?
t QWORD ?
h QWORD 2.0

intftm BYTE '%lf',0
outftm BYTE '%.2lf',0
.code
start:
invoke  scanf,ADDR intftm,ADDR x

FLD x
FMUL x
FSTP a

FLD x
FCOS 
FADD h;2.0
FSTP d

FLD x
FSIN 
FDIV d
FADD a
FSTP t

FLD t
FSQRT 
FSTP z

invoke printf,ADDR outftm,z
invoke ExitProcess,0
end start

 ;*】*/

题目2:

 ;*【*/
.386
.model flat,stdcall
option casemap:none
include kernel32.inc
includelib kernel32.lib
includelib msvcrt.lib
scanf PROTO C:DWORD,:vararg
printf PROTO C:DWORD,:vararg
.data
a QWORD ?
n QWORD ?
r QWORD ?
r1 QWORD ?
r2 QWORD ?
z QWORD ?
z1 QWORD ?
z2 QWORD ?
y QWORD 1.0
fmt BYTE '%lf %lf',0
fmt2 BYTE '%.2lf',0
.code
start:
invoke scanf,ADDR fmt,ADDR a,ADDR n
FLD n
FLD a
FYL2X
FSTP r

FLD y
FLD r
FPREM
FSTP r1;小数部分

FLD r
FSUB r1
FSTP r2;整数部分

FLD r1;小数部分F2XM1
F2XM1
FADD y
FSTP z

FLD r2; 整数部分
FLD y
FSCALE
FSTP z1

FLD z
FMUL z1
FSTP z2

invoke printf,ADDR fmt2,z2
invoke ExitProcess,0
end start

 ;*】*/

题目3:

;*【*/
.386
.model flat,stdcall
option casemap:none
include kernel32.inc
includelib kernel32.lib
includelib msvcrt.lib
scanf PROTO C:DWORD,:vararg
printf PROTO C:DWORD,:vararg
.data
x QWORD ?
y QWORD 1.0
z QWORD ?
fmt BYTE '%lf',0
fmt2 BYTE '%.3lf',0
.code
start:
invoke scanf,ADDR fmt,ADDR x
FLD x
F2XM1
FADD y
FSTP z
invoke printf,ADDR fmt2,z
invoke ExitProcess,0
end start

 ;*】*/

题目4:

 ;*【*/
.386
.model flat,stdcall
option casemap:none
include kernel32.inc
includelib kernel32.lib
includelib msvcrt.lib
scanf PROTO C:DWORD,:vararg
printf PROTO C:DWORD,:vararg
.data
x QWORD ?
y QWORD ?
z QWORD ?
z1 QWORD ?
a QWORD 180.0
b QWORD 3.1415926
ftm BYTE '%lf %lf',0
ftm2 BYTE '%g',0
.code
start:
invoke  scanf,ADDR ftm,ADDR x,ADDR y
FLD y
FLD x
FPATAN
FSTP z

FLD z
FMUL a
FDIV b
FSTP z1
invoke printf,ADDR ftm2,z1
invoke ExitProcess,0
end start


 ;*】*/

题目5:

 ;*【*/
.386
.model flat,stdcall
option casemap:none
include kernel32.inc
includelib kernel32.lib
includelib msvcrt.lib
scanf PROTO C:DWORD,:vararg
printf PROTO C:DWORD,:vararg
.data
x QWORD ?
y QWORD 1.0
z QWORD ?
intftm BYTE '%lf',0
outftm BYTE '%g %g',0
.code
start:
invoke  scanf,ADDR intftm,ADDR x
FLD y
FLD x
FPREM
FSTP z

FLD x
FSUB z
FSTP x

invoke printf,ADDR outftm,x,z
invoke ExitProcess,0
end start
 ;*】*/

题目6:

;*【*/
.386
.model flat,stdcall
option casemap:none
include kernel32.inc
includelib kernel32.lib
includelib msvcrt.lib
scanf PROTO C:DWORD,:vararg
printf PROTO C:DWORD,:vararg
.data
a QWORD ?
n QWORD ?
z QWORD ?
fmt BYTE '%lf %lf',0
fmt2 BYTE '%g*2^%g=%g',0
.code
start:
invoke scanf,ADDR fmt,ADDR a,ADDR n
FLD n
FLD a
FSCALE
FSTP z
invoke printf,ADDR fmt2,a,n,z
invoke ExitProcess,0
end start
 ;*】*

题目7:

;*【*/
.386				;选择的处理器
.model flat, stdcall	
option casemap:none		;指明标识符大小写敏感
include	kernel32.inc	;要引用的头文件
includelib	kernel32.lib	;要引用的库文件
includelib	msvcrt.lib	;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg;C语言printf函数原型声明
.data				;⑤数据段
a QWORD ?
x QWORD ?
z QWORD ?
z1 QWORD ?
z2 QWORD ?
g QWORD 1.0
h QWORD 10.0
Infmt byte '%lf %lf',0
Outfmt byte '%g',0
.code
start:
invoke scanf,addr Infmt,addr a,addr x

fld a
fld x
fyl2x
fstp z

fld g
fld h
fyl2x
fstp z1

fld z
fdiv z1
fstp z2

invoke printf,addr Outfmt,z2
invoke	ExitProcess,0		;退出进程,返回值为0
end start
 ;*】*/

 

WIN32 程序运行在保护模式下的,保护模式的历史可以追溯到 80286。而今 80286 已成为了历史。所以我们将只把精力集中于 80386 及后续的X86 系列 CPU。Windows 把每一个 Win32 应用程序放到分开的虚拟地址空间中去运行,也就是说每一个应用程序都拥有其相互独立的 4GB 地址空间,当然这倒不是说它们都拥有 4GB 的物理地址空间,而只是说能够在 4GB 的范围内寻址。操作系统将会在应用程序运行时完成 4GB 的虚拟地址和物理内存地址间的转换。这就要求编写应用程序时必须格守 Windows 的规范,否则极易引起内存的保护模式错误。而过去的 Win16 内存模式下,所有的应用程序都运行于同一个 4GB 地址空间,它们可以彼此"看"到别的程序的内容,这极易导致一个应用程序破坏另一个应用程序甚至是操作系统的数据或代码。 和 16 位 Windows 下的把代码分成 DATA,CODE 等段的内存模式不同,WIN32 只有一种内存模式,即 FLAT 模式,意思是"平坦"的内存模式,再没有 64K 的段大小限制,所有的 WIN32 的应用程序运行在一个连续、平坦、巨大的 4GB 的空间中。这同时也意味着您无须和段寄存器打交道,您可以用任意的段寄存器寻址任意的地址空间,这对于程序员来说是非常方便的,这也使得用32位汇编语言和用C语言一样方便。 在Win32下编程,有许多重要的规则需要遵守。有一条很重要的是:Windows 在内部频繁使用 ESI,EDI,EBP,EBX 寄存器,而且并不去检测这些寄存器的值是否被更改,这样当您要使用这些寄存器时必须先保存它们的值,待用完后再恢复它们,一个最显著的应用例子就是 Windows 的 CallBack 函数中。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值