文档库 最新最全的文档下载
当前位置:文档库 › 汇编语言离线作业2

汇编语言离线作业2

离线作业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

相关文档
相关文档 最新文档