2017-2018汇编语言第二次离线作业答案
1、判断下列程序段跳转的条件
1 XOR AX,1E1EH
JE EQUAL
2TEST AL,10000001B
JNZ THERE
3 CMP CX,64H
JB THERE
点评:本题目考查ZFZF=1比较结果等于0或相等转JZ/JE
ZF=0比较结果不等于0或不相等转JNZ/JNE
CF=1 JC/JB/JNAE:进位,低于,不高于等于,用于无符号数比较
(1) XOR AX,1E1EH    ;当AX1E1EH异或后
JE EQUAL
XOR指令两个操作数相应位相同该位为0,不同该位为1,该指令用于求反某些位,而不影响其他位。XOR指令经常给寄存器清0同时使得CF也清零。当AX1E1EHAX1E1EH异或后为0, 跳转至标号EQUAL
(2) TEST AL,10000001B
JNZ THERE
;测试指令TEST进行与操作但不回送,当ALD0D7至少有一位为1(一个1或两个1)时操作结果非0ZF=0,转标号THERE处,ALD0字符串长度17模式串长度D7同时为0操作结果为则ZF=1JNZ THERE 的下一条指令执行
(3) CMP CX,64H
JB THERE
;根据CX-64H操作结果设置标志位(但是不回送CX),若CX(无符号数)< 64H则转向标号THERE执行,否则即(CX>=64H) 执行下一条指令
2、假设AXSI存放的是有符号数,DXDI存放的是无符号数,请用比较指令和条件转移指令实现以下判断:
1)若DX > DI,转到ABOVE执行;
2)若AX > SI,转到GREATER执行;
3)若CX = 0,转到ZERO执行;
4)若AXSI产生溢出,转到OVERFLOW执行;
5)若SI≤AX,转到LESS_EQ执行;
6)若DI≤DX,转到BELOW_EQ执行。
无符号数比较时:
低于等于JBE/JNA CF=1ZF=1
不低于等于JNBE/JA CF=0ZF=0
低于、不高于等于:JC/JB/JNAE CF=1
不低于,高于等于:JNC/JNB/JAE CF=0
有符号数比较时:
小于,JL/JNGE, SF<>OF
不小于JNL/JGE SF=OF
小于等于JLE/JNG, ZF<>OFZF=1
不小于等于JNLE/JG SF=OF ZF=0
1)若DX > DI,转到ABOVE执行
DXDI存放的是无符号数
CMP DX,DI    ;根据DX-DI设置标志位CF,ZF,DX > DICF=0ZF=0
JA ABOVE    CF=0ZF=0,则转向标号ABOVE执行(=JNBE ABOVE

2)若AX > SI,转到GREATER执行
AXSI存放的是有符号数
CMP AX,SI      根据AX-SI设置标志位,不回送。若AX > SISF=OFZF=0
JG GREATER  JNLE GREATER SF=OFZF=0转向标号GREATER执行

3)若CX = 0,转到ZERO执行
CMP CX,0      CX=0ZF=1,否则ZF=1
JCXZ ZERO    CX=0转向标号ZERO执行
JZ ZERO        CX=0转向标号ZERO执行

4)若AXSI产生溢出,转到OVERFLOW执行
CMP AX,DI
如果是有符号数,AX-SI运算结果有溢出即<=-32768 >=+32767OF=1
否则OF=0仅仅设标志位不回送
JO OVERFLOW    OF=1则转向标号OVERFLOW执行


5)若SIAX,转到LESS_EQ执行
CMP SI,AX        如果是有符号数运算,SIAX则置标志位ZF<>OFZF=1
JLE LESS_EQ      若标志位ZF<>OFZF=1转向标号LESS_EQ执行

6DI≤DX,转到BELOW_EQ执行
DXDI存放的是无符号数
CMP DI,DX     ;无符号比较大小,若DI≤DX标志位设置为CF=1ZF=1
JBE BELOW_EQ  若标志位置为CF=1ZF=1则转向标号BELOW_EQ执行
3、按照下列要求,编写相应的程序段:
1)起始地址为STRING的主存单元中存放有一个字符串(长度大于6),把该字符串中的第1个和第6个字符(字节量)传送给DX寄存器。
3)编写一个程序段,在DX4位全为0时,使AX = 0;否则使AX = -1
6)已知字符串STRING包含有32KB内容,将其中的‘$’符号替换成空格。
7)有一个100个字节元素的数组,其首地址为ARRAY,将每个元素减1(不考虑溢出)存于原处。
8)统计以 ‘$’结尾的字符串SRTING的字符个数。
(1)
MOV SI,0              ;数据串地址偏移量0
MOV DL,STRING[SI]  ;数据串首地址STRING1个字符送DL寄存器
MOV SI,5              数据串地址偏移量5
MOV DH,STRING[SI]  ;第6个字符送DH寄存器

(3)
TEST DX,0F000H      ;截取DX4,如果DX=0ZF=1
JZ ZERO            ;在DX4位全为0ZF=1转向标号ZERO
MOV AX,-1          DX4位不全为ZF=0AX=-1
JMP DONE          ;转向标号DONE
ZERO: MOV AX,0    DX4位全为0,AX=0
DONE: RET          程序结束

(6)
MOV SI,OFFSET STRING ;串STRING首地址送源变址器SI
MOV CX,8000H          ;串长度32K送计数器CX32K=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-1CX0继续转向AGAIN直至CX=0
(7)
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停止执行

(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          ;统计结束
4、假设MYWORD是一个字变量,MYBYTE1MYBYTE2是两个字节变量,指出下列语句中的错误原因。
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
1MOV BYTE PTR [BX],1000
;字节数据范围为:无符号数0~255,有符号数128~+1271000超出了一个字节范围

2 MOV BX,OFFSET MYWORD[SI]
;寄存器的值只有程序执行时才能确定,
OFFSET是汇编过程计算偏移地址,故无法确定
;可以改为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
6、按下面要求写一个简化段定义格式的源程序
1 定义常量NUM,其值为5;数据段中定义字数组变量DATALIST,它的头5个字单元中依次存放-10254,最后1个单元初值不定;
2 代码段中的程序将DATALIST中头NUM个数的累加和存入DATALIST的最后1个字单元中。
.
MODEL SMALL          定义程序的存储模式,小型程序,采用小模式small
.STACK                    ;定义堆栈段
.DATA                    ;定义数据段
NUM EQU 5             ;等价伪指令EQU给符号名NUM定义一个数值5
DATALIST DW -1,0,2,5,4,?
; 数据段中定义字数组变量DATALIST,它的头5个字单元中依次存放-10254,最后1个单元初值不定;
.CODE                    ;定义代码段
.STARTUP                  ;说明程序起始点并建立DS,SS内容
MOV BX,OFFSET DATALIST ;指定字符串在数据段的偏移地址送BX
MOV CX,NUM              给计数器CX赋初值,符号常数NUMCX,CX=5
XOR AX,AX                清零AX作累加器用
AGAIN: ADD AX,[BX]        ;取数据累加至AX
INC BX
INC BX                    ;因为是字数据,故地址偏移量加2
LOOP AGAIN  ;修改计数器CX,CX0,继续取数据累加转向标号AGAIN,如果CX=0,累加结束,转向下一条指令
MOV [BX],AX  ;累加结束,将累加和由累加器AX转入BX指示的数据地址保存即数据表的第6个字单元
.EXIT 0                  程序结束点,返回DOS
END

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。