求一个MASM的加减法程序

求一个MASM的加减法程序,第1张

本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行消祥正确。

Code Segment

Assume CS:Code,DS:Code

---------------------------------------

功能:显示指定地址(Str_Addr)的字符串

入口:

Str_Addr=字符串地址(要求在数据段)

用法: Output Str_Addr

用法举例:Output PromptStr

Output MACRO Str_Addr

lea dx,Str_Addr

mov ah,9

int 21h

EndM

---------------------------------------

功能:输出回车换行

Output_CTLF proc Near

push ax

push dx

mov ah,02h

mov dl,0dh

int 21h

mov dl,0ah

int 21h

pop dx

pop ax

ret

Output_CTLF endp

---------------------------------------

Clear_Screen proc Near 清屏

push es

mov ax,0b800h

mov es,ax

xor di,di

mov al,20h

mov ah,es:[di][1] 取字符显示属性

mov cx,2000

cld

rep stosw 清屏

pop es

xor dx,dx

xor bh,bh

mov ah,2

int 10h

ret

Clear_Screen endp

----------谈乱-----------------------------

Addition Proc Near 加法运算

lea ax,Addition

push ax

mov cl,'+'

mov ch,'1'拿侍搏

call Input_Digit

add al,ah 加法

aaa ASCII码加调整

@@Disp_Resault:mov ah,2

push ax

jnc $+6

mov dl,ch

int 21h

pop ax

or al,30h

mov dl,al

int 21h

call Continue_Back

ret

Addition EndP

---------------------------------------

Subtration Proc Near 减法运算

lea ax,Subtration

push ax

mov cl,'-'

mov ch,'-'

call Input_Digit

sub al,ah 减法

jnc $+6

neg al

jmp @@Disp_Resault

aas ASCII码减调整

jmp @@Disp_Resault

Subtration EndP

---------------------------------------

输入两个十进制数

Input_Digit Proc Near

Output prompt_1 提示输入第一个数

call @@Input

mov bl,al

Output prompt_2 提示输入第二个数

call @@Input

mov bh,al

mov dx,bx

call Output_CTLF

mov ah,2

mov dl,bl

int 21h

mov dl,cl

int 21h

mov dl,bh

int 21h

mov dl,'='

int 21h

mov ax,bx

ret

prompt_1 db 13,10,'Please input the first digit:$'

prompt_2 db 13,10,'Please input the second digit:$'

@@Input: mov ah,1

int 21h

cmp al,'0'

jb @@Input

cmp al,'9'

ja @@Input

ret

prompt_3 db 13,10,'Continue/Back(C/B)?$'

Continue_Back: pop ax

Output prompt_3

@@Press_0: mov ah,1

int 21h

or al,20h 转换成小写

cmp al,'c'

jnz $+3

ret

cmp al,'b'

jnz @@Press_0

pop ax

ret

Input_Digit EndP

---------------------------------------

Main_Menu db 'add',13,10,'subtract',13,10,'quit',13,10,'$'

Press_Key db 7,13,10,13,10,'The complated. Press any key to exit...$'

Start:push cs

pop ds

push cs

pop es 使数据段、附加段与代码段同段

@@Menu: call Clear_Screen 清屏

Output Main_Menu 显示菜单

@@Press_1: mov ah,1

int 21h

or al,20h 转换成小写

cmp al,'q'

jz Exit_Proc 结束程序

cmp al,'a'

jnz $+10

call Clear_Screen

call Addition 加法

jmp @@Menu

cmp al,'s'

jnz @@Press_1

call Clear_Screen

call Subtration 减法

jmp @@Menu

-----------------------------------

Exit_Proc: Output Press_Key 提示 *** 作完成,按任意键结束程序

mov ah,1

int 21h

mov ah,4ch 结束程序

int 21h

Buffer dw ?,? 数据缓冲区

Code ENDS

END Start 编译到此结束

32位环境:

1、

mov ecx, n

xor edx, edx

xor eax, eax

@@:

add eax, ecx

adc edx, 0

loop @B

2、

xor edx, edx

mov eax, 1

mov ecx, n

@@:

mul ecx

loop @B

两个结果都在EDX:EAX中唯磨晌(64位)游虚,没考虑64位溢指锋出

Code Segment

Assume CS:Code,DS:Code

s1 db 129,78,99,72,63,51,49,37,253,199

Odd_Num equ 1 奇数

Even_Num equ 0 偶数

Parity equ Odd_Num 相与结果存于奇数字节

Start: push cs

pop ds

push cs

pop es 使数据段、附加段与代码段同段

cld

lea si,s1 变量s1首地址装入源变址寄存器si

mov cx,5 循环次数(10个字节,两两相与,循环5次)

.IF Parity==Odd_Num 若汪链御把相与结果存于奇数字节

L1: lodsb 读入偶数字节至累加器AL(这条指令执行后,si自动增1)

and [si],al 相与的结果存于奇数字节

inc si 准备处理后面的两个字节

loop L1

.ELSEIF Parity==Even_Num 若把相与结果存于偶数字节

L2: inc si si增1,准备读取奇数字节

lodsb 读入奇数字节至累加器AL

and [si-2],al 相与的结果存于偶数字节

loop L2

.ENDIF

Exit_Proc: mov ah,4ch 结束程序

int 21h

Code ENDS

END Start 编译到此结束

用伪指令实现分支结构

为了改善汇编语言源程序的结构,减少显式转移语句所带来混乱,在宏汇编MASM 6.11系统中,增加了表达分支结构的伪指令。该伪指令的书写格式与高级语言的书写方式相类似,汇编程序在汇编时会自动增加转移指令和相应的标号。理解并掌握该知识,对将来学习《编译原理》课程也有一定的帮助。

分支伪指令的具体格式如下:

格式1:

.IF condition 以英文“句号”开头

指令序列 条件"condition"成立时所执行的指令序列

.ENDIF

格式2:

.IF condition

指令序列1

.ELSE

指令序列2 条件"condition"不成立时所执行的指令序列

.ENDIF

格式3:

.IF condition1

指令序列1

.ELSEIF condition2

指令序列2 条件"condition2"成立时所执行的指令序列

.ENDIF

其中:条件表达式“condition”的书写方式与C语言中条件表达式的书写方式相似,也可用括号来组成复杂的条件表达式。

条件表达式中可用的 *** 作符有:==(等于)、!=(不等)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、&(位 *** 作与)、!(逻辑非)、&&(逻辑与)、||(逻辑或)等。

若在条件表达式中检测标志位的信息,则可以使用的符号名有:CARRY?(相当于CF==1)、OVERFLOW?(OF==1)、PARITY?(PF==1)、SIGN?(SF==1)、ZERO?(ZF==1)等。例如:

.IF CARRY? &&AX != BX 检测CF==1且AX!=BX是否成立

汇编语言指令序列

.ENDIF

在指令序列中,还可再含有其它的.IF伪指令,即:允许嵌套。伪指令.ELSEIF引导出另一个二叉分支,但它不能作伪指令块的第一个伪指令。

汇编程序在对“条件表达式”进行代码转换时将进行代码优化处理,以便尽可能生成最好的指令代码。如:困岩

.IF ax == 0

汇编程序会把它转换为指令“OR ax, ax”,而不是“CMP ax, 0”,因为前者比后者更好,而不是简单直接地转换为后者唤桥。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/12416055.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存