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.25有一个首地址为array的20个字的数组,说明下列程序段的功能。 mov cx,20 mov ax,0 mov si,ax sum_loop: add ax,array[si] add si,2 loop sum_loop mov total,ax
; 答:将首地址为array得20个字的数组求和,并将结果存入 total 单元中。 2.26 按照下列要求,编写相应的程序段:
(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
2.27; 对下面要求,分别给出3种方法,每种方法只用一条指令。 (1)使CF=0 : clc ; and ax,ax ;or ax,ax (2)使AX=0 : xor ax,ax ; and ax,0 ;mov ax,0 (3)同时使AX=0和CF=0: and ax,0 ;xor ax,ax ;sub ax,ax
2.28、参照本习题的示意图,分析调用序列,画出每次调用及返回时的堆栈状态。其中CALL前是该指令所在的逻辑地址;另外,段内直接调用指令的机器代码的字节数为3,段间直接调用指令则为5个字节。
2.29 已知AX 、BX存放的是4位压缩BCD表示的十进制数,请说明如下子程序的功能和出口参数。
add al,bl daa xchg al,ah adc al,bh daa xchg al,ah ret
压缩BCD码加法:AX←AX+BX 出口参数:AX=BCD码和
2.30、AAD指令是用于除法指令之前,进行非压缩BCD码调整的。实际上,处理器的调整过程是:AL←AH×10+AL,AH←0。如果指令系统没有AAD指令,请用一个子程序完成这个调整工作。
2.31、解释如下有关中断的概念: (1) 内部中断和外部中断 (2) 单步中断和断点中断 (3) 除法错中断和溢出中断 (4) 中断向量号和中断向量表
2.32、试比较INT n和段间CALL指令、IRET和段间RET指令的功能。 2.33、什么是系统功能调用?汇编语言中,它的一般格式是怎样的?
2.34; 补充例2.38,当有溢出时显示“Error! Overflow!”,无溢出时显示“OK”。 okmsg db ‘OK’, ‘$’errmsg db ‘Error ! Overflow !’, ‘$’ …
mov ax,X sub ax,Y jo overflow
mov dx,offset okmsg jmp next
overflow: mov dx,errmsg next: mov ah,9 int 21h 错误: mov ax,X sub ax,Y jo overflow
mov dx,offset okmsg
okmsg db ‘OK’, ‘$’
mov dx,errmsg ;错误1:数据定义在代码中 mov ah,9 int 21h
overflow: errmsg db ‘Error ! Overflow !’, ‘$’ mov dx,errmsg ; 错误2:缺少JMP指令 mov ah,9 int 21h
2.35、补充例2.39,显示“1”的个数;注意首先将个数转换为ASCII码。 2.36、先提示输入数字“Input Number:0 ~ 9”,然后在下一行显示输入的数字,结束;如果不是键入了0 ~ 9数字,就提示错误“Error!”,继续等待输入数字。
2.37 从键盘输入一个字符串(不超过255个),将其中的小写字母转换成大写字母,然后按原来的顺序在屏幕上显示。 ;xt237.asm .model small .stack .data
array db 255 db 0
array1 db 255 dup('$') array2 db 0dh,0ah,'$' .code .startup
mov ah,0ah ; 键盘输入字符串 mov dx,offset array int 21h
mov dx,offset array2 ; 回车换行 mov ah,09h int 21h
mov bx,offset array1 again: mov al,[bx] cmp al,'$' jz done
cmp al,'a' ; 小于a和大于z的字符不是小写字母