exit 0 end start
实验三、顺序程序设计
一)实验要求
进一步熟悉汇编环境;掌握用汇编语言编写顺序程序。 二)实验内容
1. x,y,z,v 均为16 位带符号数,计算( V - ( X * Y + Z – 540 ) ) / X
include io32.inc .data
X DW 1000 Y DW 2000 Z DW 3000 V DW 4000 .code start:
MOV AX , X
IMUL Y ; DX AX完成 x*y 运算 MOV CX, AX ; 保存乘积的低16位到CX中 MOV BX, DX ; 保存乘积的高16位到BX中
MOV AX, Z ;由于Z与 x*y的类型不统一,需要进行符号为扩展 CWD ;将Z扩充成双字数据(DX AX)? Z ADD CX, AX
ADC BX, DX ;完成X * Y + Z
SUB CX, 540 ;因540小于65535因此可以直接与 CX 相减 SBB BX, 0 ; x*y+z-540 MOV AX, V
CWD ;将Z扩充成双字数据(DX AX)? V SUB AX, CX
SBB DX, BX ; v-(x*y+z-540) IDIV X ; (v-(x*y+z-540))/x
WriteRegWord ;查看所有通用寄存器的值,观察结果商AX=f832H(-1998),余数DX=fe34(-460)。
三)实验要求
分析程序设计的基本思路,适当变化数据和算法,实现类似题目。 四)课后问题 1、CWD的含义
2、ADD与ADC的区别 3、SUB与SBB的区别 4、IMUL的含义
5、字与字相乘,被乘数和乘积存放的位置
13
6、16位有符号数的表达范围 7、WriteRegWord 含义
8、如何以十进制有符号数形式输出AX和DX的内容 9、什么情况下需要进行符号为扩展 10、叙述某个运算的过程。
实验四、分支程序设计
一)实验目的
通过本实验,熟练运算类指令对标志位状态的影响,以及标志位状态的表示方法;掌握无条件转移、条件转移指令的使用方法;掌握分支程序设计和调试方法。 二)实验内容
1、从键盘输入一个字符,判断是否为大写字母,是大写字母则转换为小写显示。
例题程序: ; 代码段
call readc ; 输入一个字符,从AL返回值 cmp al,’A’ ; 与大写字母A比较
jb done ; 比大写字母A小,不是大写字母,转移 cmp al,’Z’ ; 与大写字母Z比较
ja done ; 比大写字母Z大,不是大写字母,转移 or al,20h ; 转换为小写
call dispcrlf ; 回车换行(用于分隔) call dispc ; 显示小写字母 done:
问题:如果要实现判断是否是小写字母,并转换为大写字母输出,应该如何修改本例题程序?(提示:仅涉及3条指令)
问题:本例题程序中,可以用JL和JG分别替换JB和JA吗?为什么?请你仔细分析一下,并结合上机验证你的分析结论。
2. 如果X>50,则显示TOO_HIGH;否则计算X-Y,溢出显示OVERFLOW,若无溢出则|X-Y|→RESULT。
include io32.inc .data
x db 1 y db 12
str1 db \ str2 db \.code
14
start:
; add your code here
cmp x,50 ja td mov al,x sub al,y jo ycl jns zs
neg al jmp zs td:
WriteString str1 jmp over ycl:
WriteString str2 jmp over zs:
WriteSDecByte al over:
ReadChar al ; press any key to continue exit 0 end start2
3、功能:从键盘上输入三个数,将其中大于平均值的数据显示出来。 include io32.inc .data x dd 0 y dd 0 z dd 0
sum db \ pj db \
dayu db \ .code start:
ReadSDecDword x mov ebx,x
ReadSDecDword y add ebx,y
ReadSDecDword z add ebx,z
15
WriteString sum WriteSDecDword ebx
WriteCrlf WriteString pj
mov eax,ebx cdq
mov ecx,3
idiv ecx ;取平均值,被除数在 EDX EAX 中,除数在ECX中,商在EAX中 WriteSDecDword eax WriteCrlf
WriteString dayu
cmp x,eax ;比较 X和平均数之间的关系 jl next1 WriteChar \
WriteSDecDword x ;大于平均数则输出该数 next1:
cmp y,eax jl next2 WriteChar \
WriteSDecDword y next2:
cmp z,eax jl over
WriteChar \
WriteSDecDword z over:
ReadChar al ; press any key to continue exit 0 end start
3. 利用跳转表技术实现根据用户输入的星期几的数字代号在屏幕上显示星期几的英文名称
的功能。(提示:1)键盘输入的是数字的ASCII 码,需要转换成数字。2)建立一张跳转表,表中存放打印每个星期的程序段的入口地址。3)考虑怎么使程序代码量最小。) 三)课后问题 1、cmp与sub区别 2、如何判断溢出 3、JO的含义
4、如何判断两个数的大小 5、如何实现三个数升序 6、如何取平均数 7、如何输出字符串
16
8、Cdq什么含义
9、WriteSDecDword 什么含义
10、 如何将变量声明成字类型数据?
实验五、循环程序设计
一)实验目的
通过实验,可以掌握循环结构的各种实现方法,进一步了解循环结构中初始化部分、循环体部分、循环控制部分的功能以及他们彼此之间的关系。尤其是多重循环中外层循环和内层循环之间的关系。 二)实验内容
实现功能,将BUFF 中的内容以字符的形式显示在屏幕上。 注:
1、将1位十六进制数字转化为对应的字符时,由于数字0~9 对应字符为30H~39H ,而十六进制的0ah-0fh则对应字母A-F,ASCII码为41H-46H,因此在转化之前先对待转化的数字加30h后还需判断结果是否在30h~39h之间,如果不在即大于3ah时,需要再加7进行调整到41h~46h间,才会得到正确结果。
2、对BX内的字数据进行转化,需要分四步进行,每个数字需要单独进行转化,未来利用循环结构,本程序采用了循环左移4位来实现。
include io32.inc .data
n dw 687ah .code start:
mov ch,4 ;存储循环次数 mov cl,4 ;存储移位次数 mov bx,n ;取数字到BX中 a:
rol bx,cl ;循环左移4次
mov al,bl ;取数据的低字节到al中
and al,0fh ;取低4位
add al,30h ;加30h进行转化为字符 cmp al,3ah ;与3ah进行比较
jb next ;小于则跳转到next对应的程序执行 add al,7 ;大于等于则加7进行调整 next:
WriteChar al ;输出结果 dec ch ;循环次数减1 jnz a ;不为零继续循环
17