编写Windows 32位控制台程序,计算result=m-n*x的值。要求提示用户输入32位带符号整数m, n, x,并显示计算结果。屏幕格式为:
m= n= x=
result = m-n*x =
;Windows 32位控制台程序,计算result=m-n*x的值
.386
.model flat,stdcall
option casemap:none
includelib msvcrt.lib
printf PROTO C :dword, :vararg ;函数声明
scanf PROTO C :dword, :vararg
.data ;数据段
sztip byte 'Please Input m, n, x in order',0ah,0 ;提示用户输入
sztip1 byte 'm=',0
sztip2 byte 'n=',0
sztip3 byte 'x=',0
szres1 byte 'm=%-13d n=%-13d x=%-13d',0ah,0 ;输出m n x格式
szres2 byte 'result = m-n*x = %I64d',0ah,0
szin byte '%d',0 ;输入格式
szinq byte '%c%c',0 ;自定义"system(pause)"
.data? ;未初始化的变量
valuem dword ?
valuen dword ?
valuex dword ?
t1 byte ?
t2 byte ?
result qword ?
.code ;代码段
start:
invoke printf,
offset sztip
invoke printf,
offset sztip1 ;提示输入M
invoke scanf,
offset szin,offset valuem
invoke printf,
offset sztip2 ;提示输入N
invoke scanf,
offset szin,offset valuen
invoke printf,
offset sztip3 ;提示输入X
invoke scanf,
offset szin,offset valuex
mov eax,valuen
mov ecx,valuex
imul ecx ;带符号数相乘 存在EDX EAX 中
xor ecx,ecx
mov ecx,edx
mov ebx,eax ;高位转存到ECX 低位转存到EBX
xor eax,eax
mov eax,valuem
cdq ;将32位扩展到64位 M的高位在EDX 低位在EAX
sub eax,ebx
sbb edx,ecx ;带借位减法
mov sdword ptr [result],eax ;将eax赋给result的低位
mov sdword ptr [result+4],edx ;将edx赋给result的高位
invoke printf, ;输出64位范围内数据
offset szres2,result
invoke scanf, ;相当system(pause)
offset szinq,offset t1,offset t2
ret
end start