MASM整数+ - * / %
- 键盘输入整数x、y、z的值,求如下表达式的值:
xy+x%y-z
运行后若输入:8 4 2
则结果输出:84+8%4-2=30
请在;【/和;】/之间编写程序。
;*【*/
.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 '%d %d %d',0
outfmt BYTE '%d*%d+%d%%%d-%d=%d',13,10,0
x DWORD ?
y DWORD ?
z DWORD ?
an DWORD ?
bn DWORD ?
cn DWORD ?
anw DWORD ?
.code
start:
invoke scanf,ADDR infmt,ADDR x,ADDR y,ADDR z
MOV EAX,x
IMUL EAX,y
MOV an,EAX
MOV EAX,x
CDQ
IDIV y
MOV bn,EDX
MOV EAX,an
ADD EAX,bn
SUB EAX,z
MOV anw,EAX
invoke printf,ADDR outfmt,x,y,x,y,z,anw
invoke ExitProcess,0
end start
;*】*/
- 输入两个小写字母,然后输出其相应的大写字母。
运行后输入:
a b
则结果输出:
A B
请在;【/和;】/之间编写程序。
.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 ;⑤数据段
;*【*/
infmt BYTE '%c %c',0
outfmt BYTE '%c %c',13,10,0
x DWORD ?
y DWORD ?
an DWORD ?
bn DWORD ?
.code
start:
invoke scanf,ADDR infmt,ADDR x,ADDR y
MOV EAX,x
SUB EAX,32
MOV an,EAX
MOV EAX,y
SUB EAX,32
MOV bn,EAX
invoke printf,ADDR outfmt,an,bn
;*】*/
invoke ExitProcess,0 ;退出进程,返回值为0
end start
- 键盘输入整数x、y、z的值,求如下表达式的值:
xy+x/y-z
运行后若输入:8 4 2
则结果输出:84+8/4-2=32
请在;【/和;】/之间编写程序。
;*【*/
.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 '%d %d %d',0
outfmt BYTE '%d*%d+%d/%d-%d=%d',13,10,0
x DWORD ?
y DWORD ?
z DWORD ?
an DWORD ?
bn DWORD ?
cn DWORD ?
anw DWORD ?
.code
start:
invoke scanf,ADDR infmt,ADDR x,ADDR y,ADDR z
MOV EAX,x
IMUL EAX,y
MOV an,EAX
MOV EAX,x
CDQ
IDIV y
MOV bn,EAX
MOV EAX,an
ADD EAX,bn
SUB EAX,z
MOV anw,EAX
invoke printf,ADDR outfmt,x,y,x,y,z,anw
invoke ExitProcess,0
end start
;*】*/
after all
学习使用汇编的指令和四个寄存器(EAX,EBX,ECX,EDX)计算整数加减乘余
运算使用所的指令:
指令 | 实现运算 |
---|---|
MOV | 赋值指令,如(MOV EAX,an)为将an的值赋给EAX寄存器 |
ADD | 加法指令,如(ADD EAX,an)为将EAX加上an并且将运算后的值保存在EAX |
SUB | 减法指令,如(SUB EAX,an)为将EAX减去an并且将运算后的值保存在EAX |
IMUL | 带符号乘法指令,如(IMUL EAX,an)为将EAX乘上an并且将运算后的值保存在EAX |
CDQ | 寄存器扩充指令,使EAX和EDX分别保存除法的商和余数(在除法运算中,除了有运算后的商,还有余数,两个数无法保存在同一个寄存器下,所以需要使用扩充指令将EDX扩充进运算中保存余数) |
IDIV | 带符号除法指令(除法指令之前必须有CDQ扩充寄存器指令才能执行),如(IDIV an)为将EAX除上an并且将运算后的商保存在EAX,余数保存在EDX(除法指令和其他指令不同,指令后参数只有除数,默认将EAX除上除数,再将商保存在EAX,余数保存在EDX) |
寄存器:
整数的运算所使用的寄存器有四个,分别为EAX,EBX,ECX,EDX
其中加减乘的运算均可使用四个寄存器,但是除法只能使用EAX,EDX两个寄存器