Win32汇编练习(SMU—循环结构)

键盘输入若干个复数,分别求其模,最后再求所有模之和并显示(保留1位小数)。
 r=根号(a^2+b^2)
运行后若输入:
3.0  4.0
1.0  1.0
6.0  8.0
则结果输出:
16.4

.386
.model flat, stdcall
option casemap :none 
include kernel32.inc
includelib kernel32.lib
includelib	msvcrt.lib				;引用C库文件
printf PROTO C:ptr sbyte,:vararg	;C语言printf函数原型声明
scanf PROTO C:ptr sbyte,:vararg	;C语言scanf函数原型声明
 ;**/
.data
infmt byte '%lf %lf',0
outfmt byte '%.1lf',13,10,0
a qword ?
b qword ?
apf qword ?
bpf qword ?
jia qword ?
r qword ? 
re qword 0.0
.code
start:
fld re
invoke scanf ,addr infmt,addr a,addr b
.while eax==2
fld a
fmul a
fstp apf
fld b
fmul b
fstp bpf
fld apf
fadd bpf
fsqrt 
fstp r
fadd r
invoke scanf ,addr infmt,addr a,addr b
.endw
fstp re
invoke printf ,addr outfmt,re
invoke ExitProcess,0
end start
 ;**/
键盘输入正整数n,编程求1到正整数n之间的所有奇数之和并输出。
运行后若输入:5
则结果输出:15的奇数和为9
运行后若输入:10
则结果输出:110的奇数和为25
.386
.model flat, stdcall
option casemap :none
include kernel32.inc
includelib kernel32.lib
includelib	msvcrt.lib		;引用C库文件
printf PROTO C:ptr sbyte,:vararg	;C语言printf函数原型声明
scanf PROTO C:ptr sbyte,:vararg	;C语言scanf函数原型声明
 ;**/
.data
infmt byte '%d',0
outfmt byte '1到%d的奇数和为%d',13,10,0
n dword ?
re dword 1
.code 
start:
invoke scanf ,addr infmt ,addr n
mov ecx,1
mov eax,0
.while ecx<=n
 add eax,ecx
 inc ecx
 inc ecx
.endw
invoke printf,addr outfmt,n,eax
invoke ExitProcess,0
end start

 ;**/
//辗转相除法求两数的最大公约数(c语言)
int divisor (int a,int b) {
	int temp;    
 	if(a<b) {    
    	   temp=a;
    	   a=b;
       	   b=temp;
    }   
   	while(b!=0) {    //通过循环求两数的余数,直到余数为0
    	   temp=a%b;
    	   a=b;    
    	   b=temp;
    }
  	return a;    //返回最大公约数
}
//嵌套求两数的最小公倍数
int multiple (int a,int b) {
 	int divisor (int a,int b);    
        int temp;
  	temp=divisor(a,b);    //求出最大公约数
  	return  (a*b/temp);    //返回最小公倍数
}
键盘输入若干对整数x、y,求其相应的最大公约数。
运行后若输入:
18 12
8 12
10 12
则结果输出:
6
4
2

 ;**/
.386
.model flat, stdcall
include kernel32.inc
includelib kernel32.lib
includelib	msvcrt.lib				
printf PROTO C:ptr sbyte,:vararg	
scanf PROTO C:ptr sbyte,:vararg	
option casemap :none 
.data
infmt BYTE '%d %d',0
outfmt BYTE '%d',13,0
x DWORD ?
y DWORD ?
min dword ?
max dword ?
t dword ?
re dword ?
.code 
start:
invoke scanf ,addr infmt ,addr x,addr y
.while EAX==2
MOV t,1
FEQU=40H
FLESS=1
FLD x
FCOMP y
fnstsw ax
.if ah&FLESS  ;x<y
mov eax,y
mov max,eax
mov eax,x
mov min,eax
.else
mov eax,x
mov max,eax
mov eax,y
mov min,eax
.endif
.while t!=0
mov eax,max
cdq
idiv min
.if edx==0
mov t,edx
mov ebx,min
mov re,ebx
.else
mov ebx,min
mov max,ebx
mov eax,edx
mov min,eax
.endif
.endw
;FLD x      ;求最小公倍数
;FMUL y
;FDIV re
;FSTP re
invoke printf ,addr outfmt,re
invoke scanf ,addr infmt ,addr x,addr y
.endw
ret
end start
 ;**/
键盘输入若干对整数x、y,求其相应的最小公倍数。
运行后若输入:
18 12
8 12
10 12
则结果输出:
36
24
60

.386
.model flat, stdcall
include kernel32.inc
includelib kernel32.lib
includelib	msvcrt.lib				;引用C库文件
printf PROTO C:ptr sbyte,:vararg	;C语言printf函数原型声明
scanf PROTO C:ptr sbyte,:vararg	;C语言scanf函数原型声明
option casemap :none 
 ;**/
.data
infmt BYTE '%d %d',0
outfmt BYTE '%d',13,0
x DWORD ?
y DWORD ?
min dword ?
max dword ?
t dword ?
re dword ?
.code 
start:
invoke scanf ,addr infmt ,addr x,addr y
.while EAX==2
MOV t,1
FEQU=40H
FLESS=1
FLD x
FCOMP y
fnstsw ax
.if ah&FLESS  ;x<y
mov eax,y
mov max,eax
mov eax,x
mov min,eax
.else
mov eax,x
mov max,eax
mov eax,y
mov min,eax
.endif
.while t!=0
mov eax,max
cdq
idiv min
.if edx==0
mov t,edx
mov ebx,min
mov re,ebx
.else
mov ebx,min
mov max,ebx
mov eax,edx
mov min,eax
.endif
.endw
fld x
fmul y
fdiv re
fstp re
invoke printf ,addr outfmt,re
invoke scanf ,addr infmt ,addr x,addr y
.endw
ret
end start

 ;**/
键盘输入若干对实数x、y,求各对实数乘积和。
运行后若输入:
2.5 2
1.5 4
2.2 2
则结果输出:
15.4

;**/
.386
.model flat, stdcall
option casemap :none 
include kernel32.inc
includelib kernel32.lib
includelib	msvcrt.lib				;引用C库文件
printf PROTO C:ptr sbyte,:vararg	;C语言printf函数原型声明
scanf PROTO C:ptr sbyte,:vararg	;C语言scanf函数原型声明
.data
infmt byte '%lf %lf',0
outfm byte '%g',13,10,0
x qword ?
y qword ?
m qword ?
md qword 0.0

.code
start:
fld md
invoke scanf ,addr infmt,addr x,addr y
.while eax==2
fld x
fmul y
fstp m
fadd m
invoke scanf ,addr infmt,addr x,addr y
.endw
fstp md
invoke printf,addr outfm,md
invoke ExitProcess,0
end start

;**/
键盘输入若干实数,求其和。
运行后若输入:
1.2  2.3  3.4
则结果输出:
6.9

.386
.model flat, stdcall
include kernel32.inc
includelib kernel32.lib
includelib	msvcrt.lib				;引用C库文件
printf PROTO C:ptr sbyte,:vararg	;C语言printf函数原型声明
scanf PROTO C:ptr sbyte,:vararg	;C语言scanf函数原型声明
option casemap :none 
 ;**/
.data
infmt byte '%lf',0
outfmt byte '%g',13,10,0
n qword ?
re qword ?
.code
start:
fld re
invoke scanf,addr infmt,addr n
.while eax==1
fadd n
invoke scanf ,addr infmt,addr n
.endw
fstp re
invoke printf,addr outfmt,re
invoke ExitProcess,0
end start
 ;**/
输入若干整数,统计正数与负数和。
运行后若输入:1 -2 3 -4
则结果输出:正数和为:4 负数和为:-6

.386				;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none		;指明标识符大小写敏感
includelib	msvcrt.lib	;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data				;⑤数据段
szFmt  	BYTE	'正数和为:%d 负数和为:%d',0
 ;**/
include kernel32.inc
includelib kernel32.lib
infmt BYTE '%d',0
n sdword ?
z sdword 0
f sdword 0
.code 
start:
invoke scanf ,addr infmt,addr n
.while eax==1
.if n>=0
mov ebx,z
add ebx,n
mov z,ebx
.else
mov ebx,f
add ebx,n
mov f,ebx
.endif
invoke scanf,addr infmt,addr n
.endw
invoke printf,addr szFmt,z,f
invoke ExitProcess,0
 ;**/
end start 
键盘输入一串字符(最多80个字符),输出其中的数字。
运行后若输入:ab4du5jkf8
则结果输出:458

 ;**/
.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
infmt BYTE '%s',0
outfmt BYTE '%c',0
s BYTE 80 DUP(?)
len DWORD ?
.code
start:
invoke scanf,addr infmt,addr s
mov al,0
lea edi,s-1
mov ecx,80
.repeat
inc edi
.untilcxz[edi]==al
lea eax,s
sub edi,eax
mov len,edi
mov edi,0
.while edi<len
.if s[edi]>=48&&s[edi]<=57
invoke printf,addr outfmt,s[edi]
.endif
inc edi
.endw
invoke ExitProcess,0
end start
 ;**/
统计对角线元素之和并输出。以下程序运行后,首先输入一个小于10的整数n,
然后输入n行n列的整数矩阵,最后统计对角线元素(行列下标值相等或行列下标值之和等于n-1)之和并输出。
运行后若输入:
5
9 8 6 4 2 
1 2 3 4 5 
6 7 8 9 3 
0 9 8 7 6 
5 4 3 2 1 
则结果输出:
47

.386				;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none		;指明标识符大小写敏感
includelib	msvcrt.lib	;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data				;⑤数据段
fmt  	BYTE	'%d',0
Sum    DWORD 0
n      DWORD ?
Arr    DWORD 10 DUP(10 DUP (?))
.code
start:
invoke scanf,addr fmt,addr n
MOV ESI,0
MOV EBX,0
.WHILE ESI<n
MOV EDI,0
.WHILE EDI<n
pushA
invoke scanf,addr fmt,addr Arr[EBX+EDI*4]
popA
INC EDI
.ENDW
INC ESI
MOV EAX,n
SHL EAX,2
LEA EBX,[EBX+EAX]
.ENDW
 ;**/
MOV ESI,0
MOV EBX,0
.WHILE ESI<n
MOV EDI,0
.WHILE EDI<n

LEA EAX,[ESI+EDI+1]
.if ESI==EDI || EAX==n
mov EAX,Arr[EBX+EDI*4]
add  Sum,EAX
.endif

INC EDI
.ENDW
INC ESI
MOV EAX,n
SHL EAX,2
LEA EBX,[EBX+EAX]
.ENDW
 ;**/
invoke printf,addr fmt,Sum
ret
end start 
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值