河北工业大学汇编语言实验设计
汇编语言程序设计实验
实验一 顺序与分支程序设计
一 、实验目的
1)掌握顺序程序设计方法。
2)掌握分支程序的结构及分支程序的设计,调试方法。 3) 学习数据传送及算术和逻辑运算指令的用法。
4) 熟悉在PC机上建立、汇编、连接、调试和运行汇编语言程序的过程。
二、实验内容
1)有一字变量BUF1是以原码表示的有符号数,要求将其转换为反码和补码,分别存入BUF2和BUF3单元,并在屏幕上显示出来。
DATA SEGMENT ;数据段 BUF1 DW 7898H
BUF2 DW 4 DUP (0), 0AH, 0DH,'$'
BUF3 DW 4 DUP (0), '$'
DATA ENDS ;数据段结束 CODE SEGMENT ;代码段
ASSUME CS:CODE, DS:DATA ;段寄存器关联说明伪指令
BEGIN: MOV AX, DATA
MOV DS, AX ;将数据段的基地址装入数据段寄存器DS
河北工业大学汇编语言实验设计
MOV AX, BUF1 ;将字型变量BUF1的值装入AX寄存器 ADD AX, 0 ;AX寄存器里的数据加0,以便进行转移测试
JS NEXT ;判断(AX)的正负,若为负则转到NEXT,为正则往下顺序执行。
MOV BUF2, AX ;为正,反码与原码一样 MOV BUF3, AX ;为正,补码与原码一样 JMP EEE
NEXT: AND AX, 7FFFH ;将符号位变为0 NOT AX ;求反码
MOV BUF2, AX ;将BUF1的反码装入BUF2 INC AX ;求补码
MOV BUF3, AX ;将补码装入BUF3 EEE: MOV CX, 0004H ;将0004H装入CX计数器寄存器中 MOV DI, OFFSET BUF2 ;将DI指向变量BUF2开始的存储单元
MOV DX, [DI] ;将DI所指的数据装入DX寄存器中
ADD DI, 03 ;将DI指针下移三个字 BBB: MOV AX, DX ;将DX中的内容装入AX寄存器中 AND AX, 000FH ;即使BUF2的低四位不变,其余均变为0
CMP AL, 0AH ;比较[AL]与0AH的大小,以便能正确转换为0-9的ASCII值
JB QQQ ;若[AL]<0AH,则转到QQQ,否则,顺序执行 ADD AL, 07H ;因为[AL]>0AH,所以[AL] +07H,使得AL能转换成相应数字的ASCII值
QQQ: ADD AL, 30H ;将[AL]转换成相应数字的ASCII值 MOV [DI], AL ;将AL中的内容装入以DS中的内容为段基地址,以DI的内容为偏移地址的存储单元中
DEC DI ;DI=DI-1,即将DI指向前一个存储单元
PUSH CX ;保存CX寄存器的内容 MOV CL, 04H ;给CL寄存器赋值为04H SHR DX, CL ;将[DX]逻辑右移四位 POP CX ;恢复CX寄存器的内容
LOOP BBB ;循环判断语句,CX=CX-1,若CX不等于0,则转到BBB,将下一个低四位存入存储单元中,否则循环结束
河北工业大学汇编语言实验设计
MOV CX, 0004H ;给CX寄存器赋值为0004H
MOV SI, OFFSET BUF3 ;将SI指向变量BUF3开始的存储单元 MOV DX, [SI] ;将SI所指的数据装入DX寄存器中 ADD SI, 03H ;将DI指针下移三个字 CCC: MOV AX, DX ;将DX中的内容装入AX寄存器中
AND AX, 000FH ;即使BUF3的低四位不变,其余均变为0 CMP AL, 0AH ;比较[AL]与0AH的大小,以便能正确转换为0-9的ASCII值
JB DDD ;若[AL]<0AH,则转到DDD,否则,顺序执行 ADD AL, 07H ;因为[AL]>0AH,所以[AL] +07H,使得AL能转换成相应数字的ASCII值
DDD:ADD AL, 30H ;将[AL]转换成相应数字的ASCII值 MOV [SI], AL ;将AL中的内容装入以DS中的内容为段基地址,以SI的内容为偏移地址的存储单元中
DEC SI ;SI=SI-1,即将SI指向前一个存储单元 PUSH CX ;保存CX寄存器的内容 MOV CL, 04H ;给CL寄存器赋值为04H SHR DX, CL ;将[DX]逻辑右移四位 POP CX ;恢复CX寄存器的内容
LOOP CCC ;循环判断语句,CX=CX-1,若CX不等于0,则转到CCC,将下一个低四位存入存储单元中,否则循环结束
MOV DX, OFFSET BUF2 ;将BUF2的偏移地址装入DX寄存器中 MOV AH, 09H
INT 21H ;在屏幕上显示BUF1的反码 MOV DX, OFFSET BUF3 MOV AH, 09H
INT 21H ;在屏幕上显示BUF1的补码 MOV AH, 4CH
INT 21H ;带返回码终止 CODE ENDS END BEGIN
运行程序:执行jing1.exe敲回车:
河北工业大学汇编语言实验设计
2)有两个两字节无符号数分别放在存储单元A、B起始的缓冲器中,求其和,结果放在A起始的缓冲区并在屏幕上显示。相加若有进位不存入存储单元。
DATA SEGMENT ;数据段 A DB 34H, 18H, 2 DUP (0), '$' ;定义字节型变量,其后的每操作数都占有一个字节
B DB 56H, 83H ;定义字节型变量,其后的每操作数都占有一个字节
DATA ENDS ;数据段结束 CODE SEGMENT ;代码段 ASSUME CS: CODE, DS:DATA START: MOV AX, DATA
MOV DS, AX ;将数据段基地址装入数据段寄存器DS MOV AL, A ;将A所指的数装入AL寄存器中 MOV BL, B ;将B所指的数装入BL寄存器中 ADD AL, BL ;AL+BL->AL
MOV AH, A+1 ;将A所指的下一个字节的数据装入AH MOV BH, B+1 ;将B所指的下一个字节的数据装入BH ADC AH, BH ;AH与BH进行带进位加法
MOV A, AL ;将第一个无符号数的相加结果放在以A起始的缓冲区
MOV A+1, AH ;将第二个无符号数的相加结果放在以A+1起始的缓冲区
MOV CX, 0014H ;以下是将数据转换为相应的ASCII值 MOV DI, OFFSET A MOV DX, [DI] ADD DI, 03 NEXT: MOV AX, DX
AND AX, 000FH CMP AL, 0AH JB QQQ ADD AL, 07H QQQ: ADD AL, 30H
MOV [DI], AL DEC DI PUSH CX MOV CL, 14
河北工业大学汇编语言实验设计
SHR DX, CL POP CX LOOP NEXT MOV DX, OFFSET A MOV AH, 09H
INT 21H ;在屏幕上显示结果 MOV AH, 4CH
INT 21H ;带返回码终止 CODE ENDS END START
3) 在BUF和BUF+1、BUF+2单元分别放有一个无符号字节型数,编程序将其中最大数存入MAX单元,并在屏幕上显示。 STACK SEGMENT STACK ;堆栈段
DB 1000 DUP (0) ;定义其后的每个操作数都占有一个字节 STACK ENDS ;堆栈段结束 DATA SEGMENT ;数据段
BUF DB 72H, 34H, 1FH ;定义字节型变量,其后的每操作数都占有一个字节
MAX DB 2 DUP (?), '$' ;定义字节型变量,其后的每操作数都占有一个字节
DATA ENDS ;数据段结束 CODE SEGMENT ;代码段
ASSUME CS:CODE, DS:DATA, SS:STACK BEGIN: MOV AX, DATA
MOV DS, AX ;将数据段基地址装入数据段寄存器DS