作实验2【1】.有空加作实验【4】(1).
实验2算术及位串处理程序
【1】.在数据段预先存放16个十六进制数的ASCII码,把BX中的四位十六进制数,从左到右用查表的方法到对应数位的ASCII码,并取出显示出来。
要求见书:
参考程序:
data segment
asc db30h,31h,32h,33h,34h,35h,36h,37h,38h,39h
db41h,42h,43h,44h,45h,46h
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov cl,4
rol bx,cl
mov si,bx
and si,0fh
mov dl,[asc+si]
mov ah,2
int21h
rol bx,cl
mov si,bx汇编语言如何编程
and si,0fh
mov dl,[asc+si]
mov ah,2
int21h
mov ah,4ch
int21h
code ends
end start
【2】用字符串处理指令编制程序,处理字符串的比较和查,显示结果。
要求:(1)字符串的比较程序中,一个字符串在数据段定义,另一个字符串在程序执行时从键盘输入,必须定义键盘缓冲区。并指出不相等的位置。
参考书上例3.51,题目改为MESS2定义为从键盘输入缓冲区,键盘输入缓冲区定义:
mess2DB9,?,9DUP(?)
例3.51在数据段中有一个长度为19的字符串MESS1,在附加段中有一个长度为19的字符串MESS2,比较它们是否相等。若相等显示‘Y’,否则显示‘N’。编制程序如下所示。
data segment
mess1db‘computer software$’
data ends
ext segment
mess2db‘comkuter software$’
ext ends
code segment
assume cs:code,ds:data,es:ext
start:
mov ax,data
mov ds,ax
mov ax,ext
mov es,ax
lea si,mess1
lea di,mess2
mov cx,19
cld
repe cmpsb
jz yes;如果zf=1跳转到标号yes
mov dl,‘n’
jmp disp;跳转到标号disp
yes:mov dl,‘y’
disp:mov ah,2
int21h
mov ah,4ch
int21h
code ends
end start
实验3分支程序设计
实验目的:
掌握分支与循环程序等基本编程方法。熟悉数制转换。用LOOP指令、条件转移指令和跳跃表法实现程序转移。
实验内容:
【1】分离字数组ARRAY中的正、负数,把其中的正数复制到PDATA数组;负数复制到NDATA数组,并分别统计正、负数个数。
要求:三个数组的占用单元数应一致。通过DEBUG跟踪程序的执行,检查运行结果:是否完成分离。
参考程序:
data segment
array dw2,-2,3,-3,4,-4,5,0,0
org10h
pdata dw7dup(?)
org20h
ndata dw7dup(?)
org30h
p db0
n db0
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
lea bx,array
lea si,pdata
lea di,ndata
mov cx,7
kk:
mov ax,[bx]
test ax,8000h
jz zs
。。。。。。
jmp next
zs:
。。。。。。
next:
add bx,2
loop kk
mov dl,p
add dl,30h
mov ah,2
int21h
mov dl,n
add dl,30h
mov ah,2
int21h
mov ah,4ch
int21h
code ends
end start
【2】在数据段定义分支地址表,通过键盘输入数字1~8,实现转移。
要求:
(1)分支表定义如下:
PTABLE DW P1,P2,P3,P4,P5,P6,P7,P8
(2)P1~P8为标号,如果键盘输入数字3,则从分支地址表PTABLE中取出P3的地址,实现间接转移,标号处的指令只是显示一个信息。
参看例5.3
例5.3根据键盘输入的一位数字(0~3),使程序转移到4个不同的分支中去。
算法分析:建立一个地址表,集中存放4个分支的偏移地址,因偏移地址为16位,所以每两个字节存放一个偏移地址。根据输入的数字指向地址表,从地址表中取出对应分支的偏移地址,以间接寻址方式转向对应分支。
例5.3程序如下:
code segment
assume cs:code,ds:code
start:mov ax,code;ds=cs
mov ds,ax
mov ah,7;键盘输入无回显
int21h
cmp al,30h
jl exit;非法输入
cmp al,33h
jg exit;非法输入
mov dl,al;放入dl,待显示
mov ah,2
sub al,30h;转换ascii码为数值
shl al,1;(al)×2,指向地址表中某地址
mov bl,al
mov bh,0
jmp branch[bx];转向分支
rout0:int21h;显示键盘输入的数字
jmp exit
rout1:int21h
jmp exit
rout2:int21h
jmp exit
rout3:int21h
jmp exit
exit:mov ah,4ch;程序终止并退出
int21h
branch dw rout0
dw rout1
dw rout2
dw rout3
code ends
end start
该程序在代码段的最后定义了地址表,汇编程序进行汇编时,各标号的有效地址可以确定,地址表首地址BRANCH的有效地址可以确定,其后定义的4个字的值就是四个分支标号的有效地址。该程序也可以定义一个数据段,并把地址表BRANCH定义在数据段。
用地址表方法处理多分支程序,可以简单直接地实现分支的转移,避免了大
量的比较和条件转移指令,使程序显得简洁紧凑。
实验4循环程序设计
实验目的:
掌握和提高循环程序编程技巧,熟悉键盘输入、显示输出等基本人机交互。【1】从键盘输入7位二进制数,显示对应的字符,回车键退出循环,终止程序。参考程序:
code segment
assume cs:code
start:
mov cx,7
mov dl,0
next:
shl dl,1
mov ah,1
int21h
。。。
loop next
mov ah,2
int21h
mov ah,4ch
int21h
code ends
end start
【2】从键盘输入一个单个字符,显示该字符的ASCII码(十六进制),
回车键退出循环,终止程序。DEBUG下跟踪,注意结果。
参看例5.7,程序的核心是斜体部分,要求修改程序中的斜体部分,当然其它关联部分也需修改。
例5.7从键盘输入一个单个字符,显示该字符的ASCII码(十六进制),回车键退出循环,终止程序。
算法分析:用1号功能调用从键盘输入一个单个字符时,该字符ASCII码在AL中,为两位十六进制数,
而要显示这两位十六进制数,则要把每位十六进制数位转换成ASCII码才能用2号功能调用显示。高位十六进制数位为数字,低位十六进制数位为数字或A~F。该循环程序的循环终止条件是输入回车键。
流程图如图5.7所示:
START
键盘输入
回车?