华农总汇编程序设计题汇总情况.docx
《华农总汇编程序设计题汇总情况.docx》由会员分享,可在线阅读,更多相关《华农总汇编程序设计题汇总情况.docx(16页珍藏版)》请在冰豆网上搜索。
华农总汇编程序设计题汇总情况
1.编一个程序,实现从键盘输入一个长度不超过300个字符的串(以回车键作为输入结束),然后在下一行以倒序输出所输入的字符。
DATASSEGMENT
stringdb301dup('$')
ctrldb0ah,0dh,'$'
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
leabx,string
Movcx,0
lp1:
movah,1
int21h
cmpal,0dh
jelp2
mov[bx],al
incbx
Inccx
jmplp1
lp2:
decbx
movdl,[bx]
movah,2
int21h
looplp2
exit:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
2.编写一个程序,从键盘输入一个0~65535之间的10进制无符号数,然后以16进制形式显示出所输入的数。
datasegment
stringdb0dh
numdb4dup(?
),'H$'
tabdb'0123456789ABCDEF'
dataends
codesegment
assumecs:
code,ds:
data
begin:
movax,data
movds,ax;初始化代码段
xorbx,bx
movcx,10;进制
next:
movah,1
int21h
cmpal,0dh
jzconv;如果是回车,表示输入结束,转换开始
pushax;保存输入值,当然还有AH,因为堆栈的存取必须以字为单位
movax,bx
mulcx
movbx,ax;将先前的结果向上推一位
popax;取回本次输入
andal,0fh;屏蔽掉无用位,类SUBAL,30H
xorah,ah;高位归零
addbx,ax;合并本次输入
jmpnext
conv:
movax,bx;开始转换
movch,4
leabx,tab;bx直接定址表
movcl,4
leasi,num
lopa:
rolax,cl;把高4位移到低4位
pushax
andax,000fh;取出低4位
xlat
mov[si],al;按地址由低到高的顺序将结果由高到底存放
incsi
popax
decch
jnzlopa
leadx,string
movah,9
int21h;回车换行
movah,4ch
int21h
codeends
endbegin
3.编写一个程序,计算1+2+3+4+…+100的累加和,并把累加和以2进制形式显示出来(要使用循环累加方法,不能使用公式S=N*(N+1)/2=50*101=5050)。
DATASSEGMENT
sumdw0
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
movax,0
movbx,1
lp1:
addax,bx
incbx
cmpbx,101
jenext
jmplp1
next:
movcx,16
movbx,ax
lp3:
shlbx,1
jclp2
movah,2
movdl,0
adddl,30h
int21h
deccx
cmpcx,0
jeexit
jmplp3
lp2:
movah,2
movdl,1
adddl,30h
int21h
deccx
cmpcx,0
jeexit
jmplp3
exit:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
已知数据块BUFA中存放15个互不相同的字数据,BUFB中存放20个互不相同的字数组,编一个程序,将既在BUFA中出现,又在BUFB中出现的数据存放到BUFC开始的缓冲区中。
DATASSEGMENT
BUFAdb1,3,5,7,9,21,21,21,21,21,21,21,21,21,21
count1dw$-BUFA
BUFBdb1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
count2dw$-BUFB
BUFCdb15dup(?
)
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
leadi,BUFC
movcx,count1
movbx,0
L:
pushcx
moval,BUFA[bx]
incbx
movcx,count2
leasi,BUFB
L2:
movdl,[si]
incsi
cmpal,dl
jzL3
loopL2
jmpL4
L3:
mov[di],dl
incdi
L4:
popcx
loopL
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
5.LINK指向一个字线性表,其中的首单元保存线性表的长度,编一个程序,将该线性表中的0FFFFH项删除。
DATASSEGMENT
linkdw7,0ffffh,2,3,4,5,6,8
bufferdw7dup(0)
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVBX,0
LEASI,LINK
MOVCX,[SI]
LEADI,BUFFER+2
L:
ADDSI,2
MOVAX,[SI]
CMPAX,0FFFFH
JNZCUN
LOOPL
JMPFUZHI
CUN:
MOV[DI],AX
ADDDI,2
INCBX
LOOPL
FUZHI:
LEASI,BUFFER
MOV[SI],BX
LEADI,LINK
MOVCX,BX
L2:
ADDSI,2
ADDDI,2
MOVAX,[SI]
MOV[DI],AX
LOOPL2
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
编写一个程序,从键盘输入一个不大于16位的2进制数,然后以8进制形式显示出所输入的数。
DATASEGMENT
xdw0ah,0dh,'$'
InputBufferdb17,0,17dup(0)
UserInputdw0
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
callGetUserInput;输入子程序
movUserInput,ax;取得输入值16进制,也是2进制
leadx,x
movah,9
int21h
movbx,UserInput;取得输入值
movcl,3;移位数
movch,0;计数
next:
movax,bx
andax,0000000000000111b;取低3(111)位,即八进位
oral,'0';转ascii
pushax;保存
incch;计数
shrbx,cl;左移3位,即下一位
orbx,bx;是否完了
jnznext;未
movcl,ch;取得计数
movch,0;清0
next1:
popdx;弹出dl
movah,2;印出结果
int21h
loopnext1
movah,7;暂停
int21h
quit:
MOVAH,4CH;带返回码结束功能
INT21H;返回系统
;-----------------------
GetUserInput:
movdx,offsetInputBuffer;指向输出缓冲
movax,0c0ah;输入函数,先清空键盘缓冲
int21h
movsi,offsetInputBuffer+2
movcx,0
movcl,[si-1];取实际输入数
jcxzGetUserInput;无输入
CallGetValue;取值子程序,ax传回该值,cf=1表示错误,可能输入非数字
jcGetUserInput;输入错误,非数字
ret
;--------------------------------------------------------------------------
;转值子程序,把输入的字符转成16进制(2进制)
;输入:
ds:
si数字字符串起点,以0dh结束
;输出:
ax=转换后的16进制值,cf=1表示有非数字字符
GetValue:
pushbx
pushdi
xorbx,bx
movdi,10
GetV10:
lodsb;指向起点
movah,0;清除
cmpal,0dh;回车?
jzGetvx
cmpal,'0';以下比较0-1,否则cf=1离开
jbGetvy
cmpal,'1'
jaGetvy
subal,'0';ascii->值
shral,1;cf=1,1cf=0,0
rclbx,1;一位接一位的旋入bx
jmpshortGetV10
Getvx:
movax,bx;ascii转值后由ax转回
clc;成功cf=0
jmpshortGetvz
Getvy:
stc;错误cf=1
Getvz:
popdi
popbx
ret
;------------------------------------
CODEENDS
ENDSTART
以下面形式定义一个长整数,其所占用字节数由N得到,比如128位的数5746352413DE89674523BC9A78563412H定义成:
NUMDB12H,34H,56H,78H,9AH,0BCH,23H,45H
DB67H,89H,0DEH,13H,24H,35H,46H,57H
NDB$-NUM
试编写一个程序,实现对N字节的NUM的值求补,并把求补后的值仍保存在NUM中。
DATASSEGMENT
NUMDB12H,34H,56H,78H,9AH,0BCH,23H,45H
DB67H,89H,0DEH,13H,24H,35H,46H,57H
NDW$-NUM
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
leasi,NUM
movcx,N
stc;将CF置1
L:
moval,[si]
notal;求补即是取反+1(not为取反)
adcal,0
mov[si],al
incsi
loopL
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
4.编写一个程序,将内存地址0B800H:
0开始的32KB内容保存在文件VRAM.SCN中。
(不考虑文件处理过程中的错误)
DATASEGMENT
PATHNMDB'VRAM.SCN',0
HANDLEDW0
TIP1DB'ERROROPEN!
$'
TIP2DB'ERRORWRITE!
$'
TIP3DB'OK!
$'
DATAENDS
STACKSEGMENTSTACK
DB100HDUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
MAINPROCNEAR
START:
MOVAX,DATA
MOVDS,AX
LEADX,PATHNM
xorcx,cx;normal
movax,3c00h
INT21H
JCERROR1
PUSHDS;save
MOVHANDLE,AX
MOVBX,AX
MOVDX,0B800H
MOVDS,DX
XORDX,DX;b800:
0
MOVCX,8000H
MOVAH,40H
INT21H
POPDS;restore
JCERROR2
JMPOK
ERROR1:
MOVAH,09H
LEADX,TIP1
INT21H
JMPEXIT
ERROR2:
MOVAH,09H
LEADX,TIP2
INT21H
JMPEXIT
OK:
MOVAH,09H
LEADX,TIP3
INT21H
MOVBX,HANDLE
MOVAH,3EH;closefile
INT21H
EXIT:
MOVAH,4CH
INT21H
MAINENDP
CODEENDS
ENDMAIN