汇编程序.docx
《汇编程序.docx》由会员分享,可在线阅读,更多相关《汇编程序.docx(34页珍藏版)》请在冰豆网上搜索。
汇编程序
实验1-1——多字节数的运算
⑴、两个长度为3个字节(3B)的二进制无符号数,分别存放在首地址为buf1和buf2的连续内存单元中,编程求这两者之和,并将结果放在起始地址为res的内存单元中。
例如,这两个数据为888888H、456789H,则其和应为[1]345671H。
源代码如下:
.modelsmall
.modelsmall
.stack
.data
buf1dd888888h
buf2dd456789h
resdd0h
.code
start:
movax,@data
movds,ax
movax,wordptrbuf1;取buf1的低16位
addax,wordptrbuf2;取buf2的低16位+buf1的低16位
movwordptrres,ax;相加结果存入res
movax,wordptrbuf1+2;取buf1的高16位
adcax,wordptrbuf2+2;取buf2的高16位+buf1的高16位+CF
movwordptrres+2,ax;相加结果存入res
;输出
movcx,3;置循环初值
movsi,2
again:
movdl,byteptrres[si];依次取res的两个字节,由高到低
pushcx;保护循环值cx
movcl,4
shrdl,cl;将dl高四位移到低四位
popcx
ordl,30h;将dl高四位转化为ASCII
cmpdl,39h;判断是否大于10
jbenext1
adddl,7;加7转化为A到E字母输出
next1:
movah,2
int21h
movdl,byteptrres[si]
anddl,0fh;将dl高四位清零
ordl,30h;;将dl低四位转化为ASCII
cmpdl,39h
jbenext2
adddl,7
next2:
movah,2
int21h
decsi
loopagain
movax,4c00h
int21h
endstart
运行结果截图
⑵、将两数改为3B的压缩BCD码,重复以上实验过程。
例如,这两个数据为888888H、456789H,则其和应为[1]345677H(表示[1]345677)。
源代码如下:
.modelsmall
.modelsmall
.stack
.data
buf1dd888888h
buf2dd456789h
resdd0h
.code
start:
movax,@data
movds,ax
moval,byteptrbuf1;取buf1的低8位
addal,byteptrbuf2;取buf2的低8位+buf1的低8位
daa;调整为十进制
movbyteptrres,al;相加结果存入res
moval,byteptrbuf1+1;取buf1的中间8位
adcal,byteptrbuf2+1;取buf2的中间8位+buf1的中间8位+CF
daa;调整为十进制
movbyteptrres+1,al;相加结果存入res
moval,byteptrbuf1+2;取buf1的高8位
adcal,byteptrbuf2+2;取buf2的高8位+buf1的高8位+CF
daa;调整为十进制
movbyteptrres+2,al;相加结果存入res
;输出
movcx,3;置循环初值
movsi,2
again:
movdl,byteptrres[si];依次取res的两个字节,由高到低
pushcx;保护循环值cx
movcl,4
shrdl,cl;将dl高四位移到低四位
popcx
ordl,30h;将dl高四位转化为ASCII
cmpdl,39h;判断是否大于10
jbenext1
adddl,7;加7转化为A到E字母输出
next1:
movah,2
int21h
movdl,byteptrres[si]
anddl,0fh;将dl高四位清零
ordl,30h;;将dl低四位转化为ASCII
cmpdl,39h
jbenext2
adddl,7
next2:
movah,2
int21h
decsi
loopagain
movax,4c00h
int21h
endstart
运行结果截图:
实验1-2——BCD码操作
⑴、将存放在首地址为buf的5B的压缩BCD码分离为10B的非压缩BCD码,并存于首地址为res的单元中
原代码如下:
.
.modelsmall
.stack
.data
bufdt1223568941h;
resdt?
.code
start:
movax,@data
movds,ax
movcx,5
xorsi,si;置循环次数
leadi,buf;取其地址
again:
movdl,[di];取两个字节先保存低四位后保存高四位
anddl,0fh;置高四位为零
movbyteptrres[si],dl;保存到res单元
movdl,[di]
pushcx;保护循环次数
movcl,4
shrdl,cl;高四位移到第四位,并置高四位为零
popcx
incsi
movbyteptrres[si],dl
incsi
incdi
loopagain;循环继续取值
decsi;输出,由高位开始输出
movcx,10
again1:
movdl,byteptrres[si];依次取res的两个字节,由高到低
pushcx;保护循环值cx
movcl,4
shrdl,cl;将dl高四位移到低四位
popcx
ordl,30h;将dl高四位转化为ASCII
movah,2
int21h
movdl,byteptrres[si]
anddl,0fh;将dl高四位清零
ordl,30h;;将dl低四位转化为ASCII
movah,2
int21h
decsi
loopagain1
movax,4c00h
int21h
endstart
运行结果截图
⑵、将存放在首地址为buf的10B的非压缩BCD码合并为5B的压缩BCD码,并存于首地址为res的单元中。
10B的非压缩BCD码数据请自行设计。
源代码如下:
.modelsmall
.stack
.data
bufdt01020203050608090401h;
resdt?
.code
start:
movax,@data
movds,ax
movcx,5
xorsi,si;置循环次数
leadi,buf;取其地址
again:
movdl,[di];取两个字节
incdi
moval,[di];再依次取两个字节
pushcx
movcl,4;其中高位移四位
shlal,cl
popcx
ordl,al;相与后将其前导覆盖
movbyteptrres[si],dl;保存到res单元
incsi
incdi
loopagain;循环继续取值
decsi;输出,由高位开始输出
movcx,5
again1:
movdl,byteptrres[si];依次取res的两个字节,由高到低
pushcx;保护循环值cx
movcl,4
shrdl,cl;将dl高四位移到低四位
popcx
ordl,30h;将dl高四位转化为ASCII
movah,2
int21h
movdl,byteptrres[si]
anddl,0fh;将dl高四位清零
ordl,30h;;将dl低四位转化为ASCII
movah,2
int21h
decsi
loopagain1
movax,4c00h
int21h
endstart
运行结果截图:
⑶、将存放在内存单元buf(字节)中的BCD码转为相应的数据并存到res(字节)单元。
例如将35H转换为二进制数据应得到23H、即十进制的35。
源代码如下:
.modelsmall
.stack
.data
bufdb35h
.code
start:
movax,@data
movds,ax
movdl,buf
movcl,4
shrdl,cl
movbl,dl;bl=00000011
movdl,buf
anddl,0fh;dl=00000101
;利用移位指令,实现数值bl乘以10
shlbl,1;bl=00000110
moval,bl
shlbl,1
shlbl,1;bl=00011000
addbl,al;bl=00011110
;将乘于十之后的bl与dl相加
addbl,dl;bl=00100011
;输出
movdl,bl
movcl,4
shrdl,cl
ordl,30h
cmpdl,39h;判断是否大于10
jbenext1
adddl,7;加7转化为A到E字母输出
next1:
movah,2
int21h
movdl,bl
anddl,0fh
ordl,30h
cmpdl,39h
jbenext2
adddl,7
next2:
movah,2
int21h
movax,4c00h
int21h
endstart
运行结果截图:
实验1-3——数据的求和、求均
源代码如下:
.modelsmall
.stack
.data
bufdw0,1,2,3,4,5,6,7,8,9,90,91,92,93,94,95,96,97,98,99
res1dw?
res2dw?
res3dw?
.code
start:
movax,@data
movds,ax
leadi,buf
movcx,14h;循环次数,即20D
xorbx,bx;运算结果保存在bx里面
again:
adcbx,[di]
adddi,2
loopagain
movres1,bx;计算的结果和保存在res1
movdx,0
movax,bx
movbx,0014h
idivbx;计算平均数
movres2,ax;所得的商保存在res2
movres3,dx;所得的余数保存在res3
movbx,res2
movdl,bh;输出商,形式为十六进制
movcl,4
shrdl,cl
ordl,30h
movah,2
int21h
movdl,bh
anddl,0fh
ordl,30h
cmpdl,39h
jbenext1
adddl,7
next1:
movah,2
int21h
movdl,bl
movcl,4
shrdl,cl
ordl,30h
cmpdl,39h
jbenext2
adddl,7
next2:
movah,2
int21h
movdl,bl
anddl,0fh
ordl,30h
cmpdl,39h
jbenext3
adddl,7
next3:
movah,2
int21h
movah,2
movdl,0ah
int21h
movbx,res3
movdl,bh;输出余数,形式为十六进制
movcl,4
shrdl,cl
ordl,30h
movah,2
int21h
movdl,bh
anddl,0fh
ordl,30h
cmpdl,39h
jbenext4
adddl,7
next4:
movah,2
int21h
movdl,bl
movcl,4
shrdl,cl
ordl,30h
cmpdl,39h
jbenext5
adddl,7
next5:
movah,2
int21h
movdl,bl
anddl,0fh
ordl,30h
cmpdl,39h
jbenext6
adddl,7
next6:
movah,2
int21h
movax,4c00h
int21h
endstart
运行结果截图:
实验1-4——联合移位、代码转换和字符输出
⑴、将存放在首地址为buf、长度为3B的数据联合左移2位。
例如,左移前为888888H,左移后应为222220H
源代码如下:
.modelsmall
.stack
.data
bufdf888888h
.code
start:
movax,@data
movds,ax
shlwordptrbuf,1;低四位左移一位
rclwordptrbuf+2,1;高四位循环左移一位
shlwordptrbuf,1;低四位左移一位
rclwordptrbuf+2,1;高四位循环左移一位
;输出
movbx,wordptrbuf+2
movdl,bl
anddl,0fh
ordl,30h
movah,2
int21h
movdl,bl
movcl,4
shrdl,cl
ordl,30h
movah,2
int21h
;以上输出高两个字节
movbx,wordptrbuf
movdl,bh
movcl,4
shrdl,cl
ordl,30h
movah,2
int21h
movdl,bh
anddl,0fh
ordl,30h
movah,2
int21h
;以上输出中间两个字节
movdl,bl
movcl,4
shrdl,cl
ordl,30h
movah,2
int21h
movdl,bl
anddl,0fh
ordl,30h
movah,2
int21h
;以上输出低两个字节
movax,4c00h
int21h
endstart
运行结果截图:
⑵、将存放在首地址为buf、长度为3B数据,通过调用INT21H的AH=02H子功能、以二进制的形式从屏幕输出。
例如,数据为8421A5H,输出应为“100001000010000110100101”。
源代码如下:
.modelsmall
.stack
.data
bufdf8421A5h
.code
start:
movax,@data
movds,ax
movcx,08h;联合向左移位,移位8位
again1:
shlwordptrbuf,1
rclwordptrbuf+2,1
loopagain1
movcx,18h;输出其二进制形式
again2:
shlwordptrbuf,1
rclwordptrbuf+2,1;联合向左移位,借助CF输出起二进制形式
movdl,0
adcdl,30h;借助adc将进位标志CF转化为ASCII输出
movah,2
int21h
loopagain2
movax,4c00h
int21h
endstart
运行结果截图:
实验1-5——字符串的输入输出
源代码如下:
.modelsmall
.stack
.data
keynum=225
stringdbkeynum;定义键盘输入需要的缓冲区
db0
dbkeynumdup(0)
string1db'InputString',"$"
.code
start:
movax,@data
movds,ax
;输出提示信息InputString
movah,09h
movdx,offsetstring1
int21h
;输出回车
movah,02h
movdl,0dh
int21h
;输出换行
movah,02h
movdl,0ah
int21h
;输入字符串
movdx,offsetstring
movah,0ah
int21h
;输出换行
movdl,0ah
movah,2
int21h
movbx,offsetstring+1
movcl,[bx]
movch,0
again:
incbx
movdl,[bx]
cmpdl,'a'
jbdisp
cmpdl,'z';比较是否为小写字母
jadisp
subdl,20h;将小写字母转化为大写字母
disp:
movah,2
int21h
loopagain
movax,4c00h
int21h
endstart
运行结果截图:
实验1-6——分支形成
⑴、一批单字节有符号数,总共20个,分别统计其中0、正数、负数的个数,并将统计结果分别存放在内存单元res_z、res_p及res_m中。
相关数据请自行设计。
源代码如下:
.modelsmall
.stack
.data
count=20
arraydw-4,5,6,0,-2,3,0,-5,-6,5,3,0,-6,8,7,-5,0,4,-3,4
cplusdb0;保存正数的个数
cminusdb0;保存负数的个数
czerodb0;保存零的个数
.code
start:
movax,@data
movds,ax
movsi,offsetarray
movcx,count
again:
cmp[si],0
jlminus;小于零转入小于零计数
jzzero;等于零转入等于零计数
inccplus;否则计数正数
jmpnext
minus:
inccminus
jmpnext
zero:
incczero
next:
addsi,2
loopagain
;输出正数的个数,二进制形式
movbl,cplus
movdl,bl
movcl,4
shrdl,cl
ordl,30h
movah,2
int21h
movdl,bl
anddl,0fh
ordl,30h
movah,2
int21h
movah,2
movdl,0ah
int21h
;输出负数的个数,二进制形式
movbl,cminus
movdl,bl
movcl,4
shrdl,cl
ordl,30h
movah,2
int21h
movdl,bl
anddl,0fh
ordl,30h
movah,2
int21h
movah,2
movdl,0ah
int21h
;输出零的个数,二进制形式
movbl,czero
movdl,bl
movcl,4
shrdl,cl
ordl,30h
movah,2
int21h
movdl,bl
anddl,0fh
ordl,30h
movah,2
int21h
movax,4c00h
int21h
endstart
运行结果截图:
⑵、调用INT21H的AH=01H功能,接收从键盘输入的一个字符,当它为“F”或“f”时,输出“FORTRAN”并退出;当它为“B”或“b”时,输出“BASIC”并退出;当它为“C”或“c”时,输出“C/C++”并退出,当它为“P”或“p”时输出“PASCAL”并退出,如果输入其他字符,则什么也不输出、鸣笛一声退出
源代码如下:
.modelsmall
.stack
.data
string1db'FORTRAN',"$"
string2db'BASIC',"$"
string3db'C/C++',"$"
string4db'PASCAL',"$"
.code
start:
movax,@data
movds,ax
movah,01h
int21h
cmpal,'F';判断是否输入为F和f
jenext1
cmpal,'f'
jenext1;如果是,转入next1
cmpal,'B';判断是否输入为B和b
jenext2
cmpal,'b'
jenext2;如果是,转入next2
cmpal,'C';判断是否输入为C和c
jenext3
cmpal,'c'
jenext3;如果是,转入next3
cmpal,'P';判断是否输入为P和p
jenext4
cmpal,'p'
jenext4;如果是,转入next4
jmpnext5;否则转入next5
next1:
movah,09h
movdx,offsetstring1;显示string1
int21h
jmpnext
next2:
movah,09h
movdx,offsetstring2;显示string2
int21h
jmpnext
next3:
mov