试编写一个汇编语言程序.docx
《试编写一个汇编语言程序.docx》由会员分享,可在线阅读,更多相关《试编写一个汇编语言程序.docx(10页珍藏版)》请在冰豆网上搜索。
试编写一个汇编语言程序
1、试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来.
答案:
abc:
movah,1
int21h
cmpal,'a'
jbstop
cmpal,'z'
jastop
subal,20h
movdl,al
movah,2
int21h
jmpabc
stop:
ret
2、编写程序,比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示"MATCH",若不同则显示"NOMATCH".
答案:
datareasegment
string1db'asfioa'
string2db'xcviyoaf'
mess1db'MATCH','$'
mess2db'NOMATCH','$'
datareaends
prognamsegment
mainprocfar
assumecs:
prognam,ds:
datarea
start:
pushds
subax,ax
pushax
movax,datarea
movds,ax
moves,ax
begin:
movcx,string2-string1
movbx,mess1-string2
cmpbx,cx
jnzdispno
leadx,addr
leasi,string1
leadi,string2
repecmpsb
jnedispno
movah
,9
leadx,mess1
int21h
ret
dispno:
movah,9
leadx,mess2
int21h
ret
mainendp
prognamends
endstart
3、试编写程序,要求从键盘输入3个16进制数,并根据对3个数的比较显示如下信息:
(1)如果3个数都不相等则显示0;
(2)如果3个数中有2个数相等则显示2;
(3)如果3个数都相等则显示3.
答案:
datasegment
arraydw3dup()
dataends
codesegment
mainprocfar
assumecs:
code,ds:
data
start:
pushds
subax,ax
pushax
movax,data
movds,ax
movcx,3
leasi,array
begin:
pushcx
movcl,4
movdi,4
movdl,''
movah,02
int21h
movdx,0
input:
movah,01
int21h
andal
,0fh
shldx,cl
ordl,al
decdi
jneinput
mov[si],dx
addsi,2
popcx
loopbegin
comp:
leasi,array
movdl,0
movax,[si]
movbx,[si+2]
cmpax,bx
jnenext1
adddl,2
next1:
cmp[si+4],ax
jnenext2
adddx,2
next2:
cmp[si+4],bx
jnenum
adddl,2
num:
cmpdx,3
jldisp
movdl,3
disp:
movah,2
adddl,30h
int21h
ret
mainendp
codeends
endstart
4、已知整数变量A和B,试编写完成下述操作的程序:
(1)若两个数中有一个是奇数,则将该奇数存入A中,偶数存入B中;
(2)若两个数均为奇数,则两数分别加1,并存回原变量;
(3)若两个数均为偶数,则两变量不变.
答案:
dsegsegment
adw
bdw
dsegends
csegsegment
mainprocfar
assumecs:
cseg
,ds:
dseg
start:
pushds
subax,ax
pushax
movax,dseg
movds,ax
begin:
movax,a
movbx,b
xorax,bx
testax,0001
jzclass
testbx,0001
jzexit
xchgbx,a
movb,bx
jmpexit
class:
testbx,0001
jzexit
incb
inca
exit:
ret
mainendp
csegends
endstart
5、把0~10010之间的30个数,存入首地址为GRAD的字数组中,GRAD+i表示学号为i+1的学生成绩.另一个数组RANK是30个学生的名次表,其中RANK+I的内容是学号为i+1的学生的名次.试编写程序,根据GRAD中的学生成绩,将排列的名次填入RANK数组中(提示:
一个学生的名次等于成绩高于这个学生的人数加1).
答案:
dsegsegment
gradedw30dup()
rankdw30dup()
dsegends
csegsegment
mainprocfar
assumecs:
cseg,ds:
dseg,es:
dseg
start:
pushds
subax
,ax
pushax
movax,dseg
movds,ax
moves,ax
begin:
movdi,0
movcx,30
loop1:
pushcx
movcx,30
movsi,0
movax,grade[di]
movdx,0
loop2:
cmpgrade[si],ax
jbego_on
incdx
go_on:
addsi,2
looploop2
popcx
incdx
movrank[di],dx
sdddi,2
looploop1
ret
mainendp
csegends
endstart
6、分析下列程序的功能,写出堆栈最满时各单元的地址及内容.
SSEGSEGMENT'STACK'AT1000H;堆栈的段地址为1000H
DW128DUP()
TOSLABELWORD
SSEGENDS
;--------------------------------------------
DSEGSEGMENT
DW32DUP()
DSEGENDS
;---------------------------------------------
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:
CSEG,DS:
DSEG,SS:
SSEG
START:
MOVAX,SSEG
MOVSS
,AX
MOVAX,DSEG
MOVDS,AX
MOVAX,4321H
CALLHTOA
RETN:
MOVAH,4CH
INT21H
MAINENDP
;---------------------------------------------
HTOAPROCNEAR
CMPAX,15
JLEB1
PUSHAX
PUSHBP
MOVBP,SP
MOVBX,[BP+2]
ANDBX,0FH
MOV[BP+2],BX
POPBP
MOVCL,4
SHRAX,CL
CALLHTOA
B1:
POPAX
B2:
ADDAL,30H
JLPRT
ADDAL,07
PRT:
MOVDL,AL
MOVAH,2
INT21H
RET
HTOAENDP
CSEGENDS
;;---------------------------------------------
ENDSTART
答案:
1000:
0F2H
B1
1000:
0F4H
3
1000:
0F6H
B1
1000:
0F8H
2
1000:
0FAH
B1
1000:
0FCH
1
1000:
0FEH
RETN
1000:
100H
7、写出分配给下列中断类型号在中断向量表中的物理地址.
(1)INT12H
(2)INT8
答案:
(1)00048h
(2)00020h
8、试编写程序,它轮流测试两个设备的状态寄存器,只要一个状态寄存器的第0位为1,则与其相应的设备就输入一个字符;如果其中任一状态寄存器的第3位为1,则整个输入过程结束.两个状态寄存器的端口地址分别是0024和0036,与其相应的数据输入寄存器的端口则为0026和0038,输入字符分别存入首地址为BUFF1和BUFF2的存储区中.
答案:
movsi,0
movdi,0
test12:
inal,0024h
testal,08
jnzexit
inal,0036h
testal,08
jnzexit
dev1:
inal,0024h
testal,01
jzdev2
inal,0026h
movbuffer[si],al
incsi
dev2:
inal,0036h
testal,01
jztest12
inal,0038h
movbuff2[di],al
incdi
jmptest12
exit:
ret
9、给定(SP)=0100,(SS)=0300,(FLAGS)=0240,存储单元的内容为(00020)=0040,(00022)=0100,在段地址为0900及偏移地址为00A0的单元中有一条中断指令INT8,试问执行INT8指令后,SP,SS,IP,FLAGS的内容是什么栈顶的三个字是什么
答案:
(SP)=00FA
(SS)=0300
(IP)=0040
(FLAGS)=0040
堆栈内容:
00A1H
0900H
0240H
10、编写一个程序,接收从键盘输入的10个十进制数字,输入回车符则停止输入,然后将这些数字加密后(用XLAT指令变换)存入内存缓冲区BUFFER.加密表为;
输入数字:
0,1,2,3,4,5,6,7,8,9
密码数字:
7,5,9,1,3,6,8,0,2,4
答案:
scodedb7,5,9,1,3,6,8,0,2,4
bufferdb10dup()
;……
movsi,0
movcx,10
leabx,scode
input:
movah,01
int21h
cmpal,0ah
jzexit
andal,0fh
xlat
movbuffer[si],al
incsi
loopinput
exit:
ret
.