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 SegmentAssume 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”,因为前者比后者更好,而不是简单直接地转换为后者唤桥。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)