离线作业2
2.22、判断下列程序段跳转的条件
(1)XOR AX,1E1EH
JE EQUAL
(2)TEST AL,10000001B
JNZ THERE
(3)CMP CX,64H
JB THERE
(1) xor ax,1e1eh
je equal
;AX=1e1eh(异或后为0)
(2)test al,10000001b
jnz there
;AL的D0或D7至少有一位为1
(3) cmp cx,64h
jb there
;CX(无符号数)< 64h
2.24、假设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执行。
(1)若DX > DI,转到above执行
cmp dx,di
ja above ;=jnbe above
(2)若AX > SI,转到greater执行
cmp ax,si
jg greater ;=jnle greater
(3)若CX = 0,转到zero执行
cmp cx,0 jcxz zero
jz zero
(4)若AX-SI产生溢出,转到overflow执行;
cmp ax,di
jo overflow
(5)若SI≤AX,转到less_eq执行;
cmp si,ax
cmp ax,si
jle less_eq
jge less_eq
(6)若DI≤DX,转到below_eq执行。
cmp di,dx
cmp dx,di
jbe below_eq
jae below_eq
2.26、按照下列要求,编写相应的程序段:
(1)起始地址为STRING的主存单元中存放有一个字符串(长度大于6),把该字符串中的第1个和第6个字符(字节量)传送给DX寄存器。
(3)编写一个程序段,在DX高4位全为0时,使AX = 0;否则使AX = -1。(6)已知字符串STRING包含有32KB内容,将其中的’$’符号替换成空格。(7)有一个100个字节元素的数组,其首地址为ARRAY,将每个元素减1(不考虑溢出)存于原处。
(8)统计以’$’ 结尾的字符串SRTING的字符个数。
(1) 起始地址为string的主存单元中存放有一个字符串(长度大于6),把该字符串中的第1个和第6个字符(字节量)传送给DX寄存器。
mov si,0
mov dl,string[si] ;第1个字符送dl寄存器
mov si,5
mov dh,string[si] ;第6个字符送dh寄存器
(2) 从主存buffer开始的4个字节中保存了4个非压缩BCD码,现按低(高)地址对低(高)位的原则,将它们合并到DX中。
xor si,si ;si清零
mov al,buffer[si] ;第一字节
inc si
mov ah,buffer[si] ;第二字节
mov cl,4
shl ah,cl ;BCD码移到高半字节
or al,ah ;组合成压缩BCD码
mov dl,al ;存入dl寄..
inc si
mov al,buffer[si] ;第三字节
inc si
mov ah,buffer[si] ;第四字节
mov cl,4
shl ah,cl ;BCD码移到高半字节
or al,ah ;组合成压缩BCD码
mov dh,al ;存入dh寄..
(3) 编写一个程序段,在DX高4位全为0时,使AX = 0;否则使AX = -1。 test dx,0f000h
jz zero
mov ax,-1
jmp done
zero: mov ax,0
done: ret
(4) 有两个64位数值,按“小端方式”存放在两个缓冲区buffer1和buffer2中,编写程序段完成buffer1-buffer2功能。
lea bx,buffer1
lea dx,buffer2
mov cx,8 ;8个字节
xor si,si ;si=0
clc ;CF=0
(5) 假设从B800h : 0开始存放有100个16位无符号数,编程求它们的和,并把32位的和保存在DX.AX中。
mov ax,0b800h
mov ds,ax ;段地址
xor si,si ;地址偏移量si=0
xor dx,dx ;和的高字dx=0
mov cx,99 ;加的次数
mov ax,[si] ;第一个数
again: inc si ;指向下一个字单元
inc si
add ax,[si] ;加下一个数
jnc noc ;无进位转
inc dx ;有进位dx=dx+1
noc: dec cx ;次数-1
jnz cx,again ;非0继续加
ret
(6) 已知字符串string包含有32KB内容,将其中的’$’符号替换成空格。
mov si,offset string
mov cx,8000h ;32k=2^15=8000h
again: cmp [si],’$’
jnz next
mov [si],20h ;if [si]=’$’ [si]<-- ’’
next: inc si
loop again
(7) 有一个100个字节元素的数组,其首地址为array,将每个元素减1(不考虑溢出)存于原处。
xor si,si ;si<--0
mov cx,100 ;循环次数
again: dec array[si]
dec cx
jnz again
(8) 统计以’$’结尾的字符串srting的字符个数。
xor si,si ;si<--0
coun: cmp string[si],’$’
je done
inc si
jmp coun
done: ret
3.9、假设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 ;1000超出了一个字节范围
(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指令只有相对寻址方式,不支持间接寻址方式
3.22、在SMALL存储模式下,简化段定义格式的代码段、数据段和堆栈段的缺省段名、定位、组合以及类别属性分别是什么?
段定义伪指令段名定位组合类别组名
.CODE _TEXT WORD PUBLIC ’CODE’
.DATA _DATA WORD PUBLIC ’DATA’ DGROUP
.STACK STACK PARA STACK ’STACK’ DGROUP
3.25、按下面要求写一个简化段定义格式的源程序
(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
.stack
.data
num equ 5
datalist dw -1,0,2,5,4,?
.code
.startup
mov bx,offset datalist
mov cx,num
xor ax,ax
again: add ax,[bx]
inc bx
inc bx
loop again
mov [bx],ax .exit 0
end