汇编语言习题与答案一、填空题:把答案填在题中横线上。
1.8位无符号整数的表示范围为0~255,写成16进制形式为00H~__________;8位有符号整数的表示范围为-128~+127,写成16进制形式为__________~__________。
2.8086/8088分段管理存储空间,但每段容量最大不超过__________。
3.逻辑地址为F000:100的存储单元,其物理地址是__________。
4.用来指示堆栈栈顶的偏移地址的是__________寄存器。
5.若要测试AL寄存器D4、D2、D0位是否都为0,则可使用__________指令语句(含操作数),以产生转移条件。
这条指令执行后将利用标志位__________实现转移。
6.若定义:bdata db2dup(1,2,2dup(3),4),则dbata变量前5个单元从低地址到高地址的数据依次是__________。
7.假设varw是一个16位变量,则指令“mov varw,ax”的目的操作数的寻址方式是__________。
二、选择题:在每小题给出的四个选项中,只有一项是符合题目要求的,请把所选项前的字母填在题后的括号内。
1.对汇编语言源程序进行翻译,形成OBJ文件的是A.汇编程序B.连接程序C.编辑程序D.调试程序[]2.下列各个8位二进制数的补码中,真值最大的是A.10001000B.11111111C.00000000D.00000001[]3.MASM语句中,表达常数不正确的形式是A.01101001BB.A346HC.’A’D.5600[]4.如果SS=600H,则说明堆栈段物理地址起始于A.60HB.600HC.6000HD.60000H[]5.dw50dup(?)预留了存储空间的字节数是A.25B.50C.100D.200[]6.下列指令中有操作数在代码段中的是A.mov ax,34hB.add ax,bxC.inc word ptr[34h]D.cmp ax,[34h][]7.假设AL=5,要使得AL=0FAH,应执行的指令是A.not alB.and al,0fhC.xor al,0f0hD.or al,0fh[]8.设置逻辑段应该采用的一对伪指令是A.segment/endsB.start/end startC.proc/endpD.macro/endm[]9.条件转移指令JNE条件是A.CF=0B.CF=1C.ZF=0D.ZF=1[]10.逻辑移位指令SHL可用于A.有符号数乘以2B.有符号数除以2C.无符号数乘以2D.无符号数除以2[]11.执行“in al,dx”指令后,进入AL寄存器的数据来自A.寄存器B.存储器C.立即数D.外设端口[]12.将十进制数75以压缩BCD码送入AX,正确的指令是A.mov ax,0075B.mov ax,0705C.mov ax,0075hD.mov ax,0705h[]13.如下指令可将AX寄存器内容改变的是A.cmp ax,bxB.test ax,bxC.and ax,bxD.xchg ax,bx[]14.设AH=10H,执行“neg ah”指令后,正确的结果是A.AH=10H、CF=1B.AH=F0H、CF=0C.AH=10H、CF=0D.AH=F0H、CF=1[]15.如下程序段:again:mov es:[di],alinc diloop again可用指令__________完成相同的功能。
A.rep movsbB.rep lodsbC.rep stosbD.rep stosw[]三、问答题:1.说明8086/8088两类标志各自的作用是什么?2.子程序文档说明主要包含那些内容?3.试述mov ax,offset var和lea ax,var两条语句的异同点。
4.循环结构程序具有哪3个组成部分?各自的作用是什么?5.已知DS=2000H、BX=100H、SI=2,存储单元[21200H]~[21203H]依次存放(十六进制)2A4C B765,说明下列每条指令执行完后AX寄存器的内容。
①mov ax,[1200h]②mov ax,[bx+1101h]③mov ax,[bx][si+1100h]四、程序阅读题:1.执行如下程序段后,AL=、ZF=。
mov al,ahnot aladd al,ahinc al2.对于如下数据定义,给出各条指令执行后的结果。
fldb dw0a24fhtable db32h,52h,0a2h,215array db‘ABCD’count equ$-array①mov ax,fldb;AL=②mov cl,table[2];CL=③mov ch,array;CH=④mov dx,count;DX=3.现有程序段如下,test al,80hjz oneblmov ah,1jmp doneonebl:mov ah,0ffhdone:…在情况下,该程序段执行结果AH=1;在情况下,该程序段执行结果AH =FFH。
4.下列指令段的功能是在数组中查找数据3,请在空格中填入应有的内容。
org0120hdata1dw0,1,2,3,4,5,6,7,8,9count equ$-data1…mov di,offset data1mov ax,3cldmov cx,scasw又,该命令序列执行后,CX=、DI=。
5.设X、Y、Z、V均为16位带符号数,分别装在X、Y、Z、V存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处。
mov ax,Ximul Ymov cx,axmov bx,dxmov ax,Zcwdadd cx,axadc bx,dxsub cx,540sbb bx,0mov ax,Vcwdsub ax.cxsbb dx,bxidiv X五、程序设计题:1.按照如下要求各编写一段语句序列:①定义字节变量unpak,其中以非压缩BCD码形式存放十进制数1234;②写出指令,将一个字节数据58H输出到端口43H;③将DX、BX、AX中的48位数右移1位。
2.已知数据段变量datax、datay、dataz定义如下:datax dw5678h,89abhdatay dw9ef0h,1234hdataz dw2dup(?)编写一个程序段,实现将datax和datay中双字数据相加,并存入dataz单元。
3.用一个程序段完成“REP MOVSW”指令的功能。
4.编写一个程序段,用空格符将字符区char-field填满,该字符区的字符数在count字节变量中保存。
5.写一个子程序,将AX的内容以二进制的形式显示到屏幕上。
6.请编写一个完整的汇编语言源程序。
要求如下:①数据段定义一个月份变量,存放数据1~12之间的月份;它对应12个月份的英文缩写,JAN、FEB、MAR、APR、MAY、JUN、JUL、AUG、SEP、OCT、NOV、DEC。
②主程序将月份传送给子程序。
汇编语言参考答案一、填空题1.8位无符号整数的表示范围为0~255,写成十六进制形式为00H~FFH,8位有符号整数的表示范围为-128~+127,写成十六进制形式为80H~7FH。
2.8086/8088分段管理存储空间,但每段容量最大不超过64KB。
3.逻辑地址为F000:100的存储单元,其物理地址是F0100H。
4.用来指示堆栈栈顶的偏移地址的是SP寄存器。
5.若要测试AL寄存器D4、D2、D0位是否都为0,则可使用test al,00010101b指令语句(含操作数),以产生转移条件。
这条指令执行后将利用标志位ZF实现转移。
6.若定义:bdata db2dup(1,2,2dup(3),4),则dbata变量前5个单元从低地址到高地址的数据依次是1,2,3,3,4。
7.假设varw是一个16位变量,则指令“mov varw,ax”的目的操作数的寻址方式是存储器直接寻址方式。
二、选择题1.A2.D3.B4.C5.C6.A7.A8.A9.C10.C11.D12.C13.C14.D15.C三、问答题1.状态标志——记录指令执行结果的有关状态,例如,进位、溢出、符号等;控制标志——用来控制处理器执行指令的方式,例如,可否中断、是否单步执行指令等。
2.子程序名和子程序功能:子程序的入口参数和出口参数;子程序的调用说明等。
3.相同——这两条指令都用来获取var的偏移地址。
不同——传送指令“mov ax,offset var”是在汇编阶段由汇编程序计算出偏移地址而“lea ax,var”则是在处理器执行该指令时再计算偏移地址。
4.循环初始部分——为开始循环设置参数,例如,循环次数、初值等。
循环体部分——重复执行的程序段,包括对循环条件的改变。
循环控制部分——判断循环条件是否成立、确定是否退出循环。
5.①AX=4c2ah②AX=b74ch③AX=65b7h四、程序阅读题1.AL=0、ZF=1。
2.①mov ax,fldb;AL=4fh②mov cl,table[2];CL=a2h③mov ch,array;CH=‘A’④mov dx,count;DX=43.在AL寄存器中最高位为1情况下,该程序段执行结果AH=1;在AL寄存器中最高位为0情况下,该程序段执行结果AH=FFH。
4.mov di,offset data1mov ax,3cldmov cx,count/2repnz scasw该命令序列执行后,CX=06h、DI=128h。
5.计算公式:[V-(X×Y+Z-540)]÷X计算结果:商存在AX中,余数存在DX中。
五、程序设计题1.①定义字节变量unpak,其中以非压缩BCD码形式存放十进制数1234;unpak db4,3,2,1②写出指令,将一个字节数据58H输出到端口43H;mov al,58hout43h,al③将DX、BX、AX中的48位数右移1位。
shr dx,1rcr bx,1rcr ax,12.mov ax,dataxadd ax,dataymov da,datax+2adc dx,datay+2mov dataz,axmov dataz+2,dx3.push axagain:mov ax,[si]mov es:[di],axadd si,2;sub si,2add di,2;sub di,2loop againpop ax4.mov cl,countmov ch,0mov di,offset char-fieldcldmov al,’’rep stowb5.bdisp procpush axpush cxpush dxmov cx,16again mov dx,0shl ax,1;从高位到低位显示push axadc dx,30h;转换为0或1的ASCII码mov ah,2;显示int21hpop axloop againpop dxpop cxpop axretbdisp endp6.stack segment stack;堆栈段db1024dup(0)stack endsdata segment;数据段mnum db4month db‘JAN’,’FEB’,’MAR’,’APR’,’MAY’,’JUN’db‘JUL’,’AUG’,’SEP’,’OCT’,’NOV’,’DEC’data endscode segment‘code’;代码段assume cs:code,ds:data,ss:stackstart:mov ax,data;程序开始点mov ds,axmov al,mnumcall mschmov cx,3again:mov dl,[bx]mov ah,2int21hinc bxloop againmov ax,4c00hint21h;程序结束;子程序:采用寄存器传递入口参数和出口参数msch procpush sidec alxor ah,ahmov si,axshl ax,1add si,ax;月份乘以3作为索引mov bx,month[si];因为每个英文缩写都是3个字符pop siretmsch endpcode endsend start。