2017-2018汇编语言第二次离线作业答案
1、判断下列程序段跳转的条件
(1) XOR AX,1E1EH
JE EQUAL
(2)TEST AL,10000001B
JNZ THERE
(3) CMP CX,64H
JB THERE
(1) XOR AX,1E1EH
JE EQUAL
(2)TEST AL,10000001B
JNZ THERE
(3) CMP CX,64H
JB THERE
点评:本题目考查ZF,ZF=1比较结果等于0或相等转JZ/JE
ZF=0比较结果不等于0或不相等转JNZ/JNE
CF=1 JC/JB/JNAE:进位,低于,不高于等于,用于无符号数比较
(1) XOR AX,1E1EH ;当AX与1E1EH异或后
JE EQUAL
;
JE EQUAL
;
XOR指令两个操作数相应位相同该位为0,不同该位为1,该指令用于求反某些位,而不影响其他位。XOR指令经常给寄存器清0同时使得CF也清零。当AX=1E1EH时AX与1E1EH异或后为0, 跳转至标号EQUAL处
(2) TEST AL,10000001B
JNZ THERE
;测试指令TEST进行与操作但不回送,当AL的D0或D7至少有一位为1(一个1或两个1)时操作结果非0,ZF=0,转标号THERE处,AL的D0字符串长度17模式串长度和D7同时为0操作结果为则ZF=1转JNZ THERE 的下一条指令执行
JNZ THERE
;测试指令TEST进行与操作但不回送,当AL的D0或D7至少有一位为1(一个1或两个1)时操作结果非0,ZF=0,转标号THERE处,AL的D0字符串长度17模式串长度和D7同时为0操作结果为则ZF=1转JNZ THERE 的下一条指令执行
(3) CMP CX,64H
JB THERE
;根据CX-64H操作结果设置标志位(但是不回送CX),若CX(无符号数)< 64H则转向标号THERE执行,否则即(CX>=64H) 执行下一条指令
JB THERE
;根据CX-64H操作结果设置标志位(但是不回送CX),若CX(无符号数)< 64H则转向标号THERE执行,否则即(CX>=64H) 执行下一条指令
2、假设AX和SI存放的是有符号数,DX和DI存放的是无符号数,请用比较指令和条件转移指令实现以下判断:
(1)若DX > DI,转到ABOVE执行;
(2)若AX > SI,转到GREATER执行;
(3)若CX = 0,转到ZERO执行;
(4)若AX-SI产生溢出,转到OVERFLOW执行;
(5)若SI≤AX,转到LESS_EQ执行;
(6)若DI≤DX,转到BELOW_EQ执行。
(2)若AX > SI,转到GREATER执行;
(3)若CX = 0,转到ZERO执行;
(4)若AX-SI产生溢出,转到OVERFLOW执行;
(5)若SI≤AX,转到LESS_EQ执行;
(6)若DI≤DX,转到BELOW_EQ执行。
无符号数比较时:
低于等于JBE/JNA CF=1或ZF=1
不低于等于JNBE/JA CF=0且ZF=0
低于、不高于等于:JC/JB/JNAE, CF=1
不低于,高于等于:JNC/JNB/JAE CF=0
有符号数比较时:
小于,JL/JNGE, SF<>OF
不小于JNL/JGE SF=OF
小于等于JLE/JNG, ZF<>OF或ZF=1
不小于等于JNLE/JG SF=OF且 ZF=0
(1)若DX > DI,转到ABOVE执行
DX和DI存放的是无符号数
CMP DX,DI ;根据DX-DI设置标志位CF,ZF,若DX > DI则CF=0且ZF=0
JA ABOVE ;CF=0且ZF=0,则转向标号ABOVE执行(=JNBE ABOVE )
CMP DX,DI ;根据DX-DI设置标志位CF,ZF,若DX > DI则CF=0且ZF=0
JA ABOVE ;CF=0且ZF=0,则转向标号ABOVE执行(=JNBE ABOVE )
(2)若AX > SI,转到GREATER执行
AX和SI存放的是有符号数
CMP AX,SI ;根据AX-SI设置标志位,不回送。若AX > SI则SF=OF且ZF=0
CMP AX,SI ;根据AX-SI设置标志位,不回送。若AX > SI则SF=OF且ZF=0
JG GREATER ;=JNLE GREATER SF=OF且ZF=0转向标号GREATER执行
(3)若CX = 0,转到ZERO执行
CMP CX,0 ;CX=0则ZF=1,否则ZF=1
JCXZ ZERO ;CX=0转向标号ZERO执行
JZ ZERO ;CX=0转向标号ZERO执行
JZ ZERO ;CX=0转向标号ZERO执行
(4)若AX-SI产生溢出,转到OVERFLOW执行
CMP AX,DI
;如果是有符号数,AX-SI运算结果有溢出即<=-32768 或>=+32767则OF=1
否则OF=0仅仅设标志位不回送
JO OVERFLOW ;若OF=1则转向标号OVERFLOW执行
JO OVERFLOW ;若OF=1则转向标号OVERFLOW执行
(5)若SI≤AX,转到LESS_EQ执行
CMP SI,AX ;如果是有符号数运算,SI≤AX则置标志位ZF<>OF或ZF=1
JLE LESS_EQ ;若标志位ZF<>OF或ZF=1转向标号LESS_EQ执行
(6)若DI≤DX,转到BELOW_EQ执行
DX和DI存放的是无符号数
CMP DI,DX ; ;无符号比较大小,若DI≤DX标志位设置为CF=1或ZF=1
JBE BELOW_EQ ;若标志位置为CF=1或ZF=1则转向标号BELOW_EQ执行
JBE BELOW_EQ ;若标志位置为CF=1或ZF=1则转向标号BELOW_EQ执行
3、按照下列要求,编写相应的程序段:
(1)起始地址为STRING的主存单元中存放有一个字符串(长度大于6),把该字符串中的第1个和第6个字符(字节量)传送给DX寄存器。
(3)编写一个程序段,在DX高4位全为0时,使AX = 0;否则使AX = -1。
(1)起始地址为STRING的主存单元中存放有一个字符串(长度大于6),把该字符串中的第1个和第6个字符(字节量)传送给DX寄存器。
(3)编写一个程序段,在DX高4位全为0时,使AX = 0;否则使AX = -1。
(6)已知字符串STRING包含有32KB内容,将其中的‘$’符号替换成空格。
(7)有一个100个字节元素的数组,其首地址为ARRAY,将每个元素减1(不考虑溢出)存于原处。
(8)统计以 ‘$’结尾的字符串SRTING的字符个数。
(7)有一个100个字节元素的数组,其首地址为ARRAY,将每个元素减1(不考虑溢出)存于原处。
(8)统计以 ‘$’结尾的字符串SRTING的字符个数。
(1)
MOV SI,0 ;数据串地址偏移量0
MOV DL,STRING[SI] ;数据串首地址STRING第1个字符送DL寄存器
MOV SI,5 ;数据串地址偏移量5
MOV DH,STRING[SI] ;第6个字符送DH寄存器
MOV SI,0 ;数据串地址偏移量0
MOV DL,STRING[SI] ;数据串首地址STRING第1个字符送DL寄存器
MOV SI,5 ;数据串地址偏移量5
MOV DH,STRING[SI] ;第6个字符送DH寄存器
(3)
TEST DX,0F000H ;截取DX高4位,如果DX=0,ZF=1
JZ ZERO ;在DX高4位全为0时ZF=1转向标号ZERO
MOV AX,-1 ;DX高4位不全为ZF=0,AX=-1
JMP DONE ;转向标号DONE
ZERO: MOV AX,0 ;DX高4位全为0,AX=0
DONE: RET ;程序结束
ZERO: MOV AX,0 ;DX高4位全为0,AX=0
DONE: RET ;程序结束
(6)
MOV SI,OFFSET STRING ;串STRING首地址送源变址器SI
MOV CX,8000H ;串长度32K送计数器CX,32K=2^15=8000H
AGAIN: CMP [SI],‘$’ ;取字符送SI,是$则ZF=1,否则ZF=0
JNZ NEXT ;不是$,转向取下一个字符标号NEXT
MOV [SI],20H ;IF [SI]=‘$’送 [SI] 空格
NEXT: INC SI ;修改源变址器指针+1
LOOP AGAIN ;计数器CX-1,CX非0继续转向AGAIN直至CX=0
(7)
XOR SI,SI ;自己异或清零SI,SI<--0 源变址寄存器
XOR SI,SI ;自己异或清零SI,SI<--0 源变址寄存器
MOV CX,100 ;循环次数 100送计数器
AGAIN: DEC ARRAY[SI] ;数据首地址ARRAY,偏移量在SI,依次取数组元素,内容-1
DEC CX ;修改计数器,-1
JNZ AGAIN ;CX不等于零继续转向AGAIN执行直至CX=0停止执行
AGAIN: DEC ARRAY[SI] ;数据首地址ARRAY,偏移量在SI,依次取数组元素,内容-1
DEC CX ;修改计数器,-1
JNZ AGAIN ;CX不等于零继续转向AGAIN执行直至CX=0停止执行
(8)
XOR SI,SI ;数组元素偏移量初始化为0SI<--0
COUN: CMP STRING[SI],‘$’
;数组首地址STRING,依次取字符串中字符,比较是否字符串结尾符号$
;是则ZF=1,不是则ZF=0
JE DONE ;若ZF=1则转向标号DONE,统计结束,未完继续下条指令
INC SI ;修改偏移量SI+1
JMP COUN ;转向标号COUN继续
DONE: RET ;统计结束
JE DONE ;若ZF=1则转向标号DONE,统计结束,未完继续下条指令
INC SI ;修改偏移量SI+1
JMP COUN ;转向标号COUN继续
DONE: RET ;统计结束
4、假设MYWORD是一个字变量,MYBYTE1和MYBYTE2是两个字节变量,指出下列语句中的错误原因。
(1) MOV BYTE PTR [BX],1000
(2) MOV BX,OFFSET MYWORD[SI]
(3) CMP MYBYTE1,MYBYTE2
(4) MOV AL,MYBYTE1+MYBYTE2
(5) SUB AL,MYWORD
(6) JNZ MYWORD
(1) MOV BYTE PTR [BX],1000
(2) MOV BX,OFFSET MYWORD[SI]
(3) CMP MYBYTE1,MYBYTE2
(4) MOV AL,MYBYTE1+MYBYTE2
(5) SUB AL,MYWORD
(6) JNZ MYWORD
(1)MOV BYTE PTR [BX],1000
;字节数据范围为:无符号数0~255,有符号数—128~+127,1000超出了一个字节范围
(2) MOV BX,OFFSET MYWORD[SI]
;寄存器的值只有程序执行时才能确定,
;
;
而OFFSET是汇编过程计算偏移地址,故无法确定
;可以改为LEA BX,MYWORD[SI]
;可以改为LEA BX,MYWORD[SI]
(3) CMP MYBYTE1,MYBYTE2
;两个都是存储单元,指令不允许
(4) MOV AL,MYBYTE1+MYBYTE2
;变量值只有执行时才确定,汇编过程不能计算
(5) SUB AL,MYWORD
;字节量AL与字量MYWORD,类型不匹配
(6) JNZ MYWORD
;JCC指令只有相对寻址方式,不支持间接寻址方式
5、在SMALL存储模式下,简化段定义格式的代码段、数据段和堆栈段的缺省段名、定位、组合以及类别属性分别是什么?
段定义伪指令 段名 定位 组合 类别 组名
.CODE _TEXT WORD PUBLIC ‘CODE’
.DATA _DATA WORD PUBLIC ‘DATA’ DGROUP
.STACK STACK PARA STACK ‘STACK’ DGROUP
.CODE _TEXT WORD PUBLIC ‘CODE’
.DATA _DATA WORD PUBLIC ‘DATA’ DGROUP
.STACK STACK PARA STACK ‘STACK’ DGROUP
6、按下面要求写一个简化段定义格式的源程序
(1) 定义常量NUM,其值为5;数据段中定义字数组变量DATALIST,它的头5个字单元中依次存放-1、0、2、5和4,最后1个单元初值不定;
(2) 代码段中的程序将DATALIST中头NUM个数的累加和存入DATALIST的最后1个字单元中。
(1) 定义常量NUM,其值为5;数据段中定义字数组变量DATALIST,它的头5个字单元中依次存放-1、0、2、5和4,最后1个单元初值不定;
(2) 代码段中的程序将DATALIST中头NUM个数的累加和存入DATALIST的最后1个字单元中。
.
MODEL SMALL ;定义程序的存储模式,小型程序,采用小模式small
.STACK ;定义堆栈段
.DATA ;定义数据段
NUM EQU 5 ;等价伪指令EQU给符号名NUM定义一个数值5
DATALIST DW -1,0,2,5,4,?
.STACK ;定义堆栈段
.DATA ;定义数据段
NUM EQU 5 ;等价伪指令EQU给符号名NUM定义一个数值5
DATALIST DW -1,0,2,5,4,?
; 数据段中定义字数组变量DATALIST,它的头5个字单元中依次存放-1、0、2、5和4,最后1个单元初值不定;
.CODE ;定义代码段
.STARTUP ;说明程序起始点并建立DS,SS内容
MOV BX,OFFSET DATALIST ;指定字符串在数据段的偏移地址送BX
MOV CX,NUM ;给计数器CX赋初值,符号常数NUM送CX,CX=5
XOR AX,AX ;清零AX作累加器用
AGAIN: ADD AX,[BX] ;取数据累加至AX
INC BX
INC BX ;因为是字数据,故地址偏移量加2
.CODE ;定义代码段
.STARTUP ;说明程序起始点并建立DS,SS内容
MOV BX,OFFSET DATALIST ;指定字符串在数据段的偏移地址送BX
MOV CX,NUM ;给计数器CX赋初值,符号常数NUM送CX,CX=5
XOR AX,AX ;清零AX作累加器用
AGAIN: ADD AX,[BX] ;取数据累加至AX
INC BX
INC BX ;因为是字数据,故地址偏移量加2
LOOP AGAIN ;修改计数器CX,CX非0,继续取数据累加转向标号AGAIN,如果CX=0,累加结束,转向下一条指令
MOV [BX],AX ;累加结束,将累加和由累加器AX转入BX指示的数据地址保存即数据表的第6个字单元
.EXIT 0 ;程序结束点,返回DOS
END
MOV [BX],AX ;累加结束,将累加和由累加器AX转入BX指示的数据地址保存即数据表的第6个字单元
.EXIT 0 ;程序结束点,返回DOS
END
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论