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