汇编上机.docx
- 文档编号:24803406
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:14
- 大小:17.10KB
汇编上机.docx
《汇编上机.docx》由会员分享,可在线阅读,更多相关《汇编上机.docx(14页珍藏版)》请在冰豆网上搜索。
汇编上机
1.编写子程序——显示字符串
子程序名称:
show-str
功能:
在指定的位置,用指定的颜色,显示一个用0结束的字符串。
参数:
(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79)
(cl)=颜色,ds:
si指向字符串的首地址
返回:
无
应用举例:
在屏幕的8行3列,用绿色显示data段中的字符串
assumecs:
codesg
showStringsegment
db'fghfghf',0
showStringends
codesgsegment
start:
movdh,8;行号
movdl,3;列号
movcl,2;绿色
movax,showString
movds,ax
movsi,0
callshow_str
movax,4c00h
int21h
show_str:
pushdx
movax,0b800h
moves,ax
decdh
moval,160
muldh
adddl,dl
movdh,0;计算显示在屏幕位置
addax,dx
movdi,ax
movah,cl
x:
movcl,ds:
[si]
movch,0
jcxzf
moval,cl
moves:
[di],ax
incsi
adddi,2
jmpx
f:
popdx
ret
codesgends
endstart
2.编程:
当0号中断产生时,在屏幕中间显示如下提示信息“divideoverflow!
”
assumecs:
code
codesegment
start:
movax,cs
movds,ax
movsi,offsetdo;设置ds:
si指向源地址
movax,0
moves,ax
movdi,200h;设置es:
si指向目的地址
movcx,offsetdoend-offsetdo;安装中断例程
cld;设置cx为传输长度传输方向为正
repmovsb
movwordptres:
[0],200h
movwordptres:
[2],0;设置中断向量表
movdx,0ffffh
movbx,1;测试一下
divbx
movax,4c00h
int21h
do:
jmpshortdostart
db'divideoverflow!
'
dostart:
movax,0
movds,ax
movsi,202h
movax,0b800h
moves,ax
movdi,160*12+36*2;设置es:
di指向显存空间中间位置
movcx,16
s:
moval,ds:
[si]
movah,2
moves:
[di],ax
incsi
incdi
incdi
loops
movax,4c00h
int21h
doend:
nop
codeends
endstart
3.编程,将datasg段中每个单词的头一个字母改为大写字母
assumecs:
codesg,ds:
datasg
datasgsegment
db'1.file'
db'2.edit'
db'3.search'
db'4.view'
db'4.options'
db'6.help'
datasgends
codesgsegment
start:
movax,datasg
movds,ax
movbx,0
movcx,6
s:
moval,[bx+3]
andal,11011111B
mov[bx+3],al
addbx,16
loops
movax,4c00h
int21h
codesgends
endstart
R命令T命令U命令G0018命令ds:
0命令
4.计算ffff:
0-ffff:
b字节单元中的数据和,结果存储在dx中。
assumecs:
code
codesegment
movax,0ffffh
movds,ax
movbx,0
movdx,0
movcx,12
s:
moval,[bx]
movah,0
adddx,ax
incbx
loops
movax,4c00h
int21h
codeends
end
5.在内存2000h段中查找第一个值为0的字节,并将它的偏移地址保存在dx中。
方法1:
assumecs:
code
codesegment
start:
movax,2000h
movds,ax
movbx,0
s:
movcl,[bx]
movch,0
inccx
incbx
loops
ok:
decbx
movdx,bx
movax,4c00h
int21h
codeends
endstart
方法2:
assumecs:
code
codesegment
start:
movax,2000h
movds,ax
movbx,0
s:
movch,0
movcl,[bx]
jcxzok;当cx=0时,CS:
IP指向OK
incbx
jmpshorts
ok:
movdx,bx
movax,4c00h
int21h
codeends
endstart
6.编程对内存中两个128位数据进行相加,结果存储在第一个数的存储空间中。
CODESSEGMENT
START:
pushax
pushcx
pushsi
pushdi
subax,ax;将CF设零
movcx,8
s:
movax,[si];第一位数放入ax中
adcax,[di];将已进入ax的第一位数与第二位数相加
mov[si],ax;相加结果已放入ax,再将ax移回第一位数的内存单元中保存
incsi;因为它为字单元,因为加2
incsi;不使用add,为了防止影响CF,下次执行adc时可能会出错。
incdi
incdi
popdi
popsi
popcx
popax
ret;程序返回
CODESENDS
ENDSTART
7.统计f000:
0处开始的32个字节中,大小在【32,128】的数据的个数。
codesegment
start:
movax,0f000h
movds,ax
movbx,0
movcx,0
movdx,0
movcx,32
s:
moval,[bx]
cmpal,32
jbs0
cmpal,128
jas0
incdx
s0:
incbx
loops
movah,4ch
int21h
codeends
endstart
8.将一个包含任意字符,以0结尾的字符串中的小写字母转变为大写字母。
assumecs:
code
datasegment
db"Beginner'sAll-purposeSymbolicInstructionCode.",0,'$'
dataends
codesegment
start:
movax,data
movds,ax
movsi,0
callletterc;调用letterc
movdx,[0]
movah,9;屏幕输出显示
int21h
movax,4c00h
int21h
letterc:
pushcx;防止寄存器冲突
pushsi
s2:
movcl,[si]
movch,0
jcxzok;判断是否结束
cmpcl,61h
jnbs1;判断是否大于'a'
incsi
jmps2
s:
andcl,11011111b;大写
mov[si],cl
incsi
jmps2
s1:
cmpcl,80h
jnas;判断是否小于'z'
incsi
jmps2
ok:
popsi
popcx
ret
codeends
endstart
9.利用BIOS提供的中断例程,在屏幕中央显示字符串“hello!
”
assumecs:
codesg,ds:
data
datasegment
db'hello'
dataends
codesgsegment
start:
movax,data
movds,ax
movsi,0
movcx,5
moval,37
s:
pushcx
pushax
movah,2
movbh,0
movdh,12
movdl,al
int10h
movah,9
moval,[si]
movbl,00000010B
movbh,0
movcx,1
int10h
incsi
popax
popcx
incal
loops
movax,4c00h
int21h
codesgends
endstart
10.统计data段中数值小于8的字节的个数,并用ax保存统计结果。
assumecs:
code
datasegment
db8,11,8,1,8,5,63,38
dataends
codesegment
start:
movax,data
movds,ax
movax,0
movbx,0
movcx,8
s:
cmpbyteptr[bx],8
jnbnext
incax
next:
incbx
loops
MOVAH,4CH
INT21H
codeends
endstart
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 上机