; wjxt323.asm .model small .code start: mov ax,0040h ;送段地址
mov ds, ax mov si, 0 ;偏移地址 mov cx, si ;计数(循环次数) xor ax, ax ;空格计数器清零
again: cmp byte ptr [si], 20h ;与空格的ASCII码比较 jne next ;不是空格,转 inc ax ;是空格,空格数加1 next: inc si ;修改地址指针 loop again ;cx=cx-1,如cx=0 退出循环 .exit 0 end start
〔习题3.24〕
编写计算100个正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示‘Overflow !’。 〔解答〕
;数据段
count parray
equ 100
dw count dup(?)
;假设有100个数据
wordsum dw 0
msg db ?overflow?,?$? ;代码段
mov cx,count mov ax,0 mov bx,offset parray again: add ax,[bx] jnc next mov dx,offset msg mov ah,9 int 21h ;显示溢出信息 jmp done ;然后,跳出循环体 next: add bx,2 loop again mov wordsum,ax
21
done: … 〔习题3.25〕
编程把一个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数。转换算法可以是:用二进制数除以10000,商为“万位”,再用余数除以1000,得到“千位”;依次用余数除以100、10和1,得到“百位”、“十位”和“个位”。 〔解答〕
;wjxt325.asm .model small .stack 256 .data array dw ? ;源字数据 dbcd db 5 dup(?) ;五位bcd结果,高对高低对低 .code .startup mov dx, array ;取源数据(余数) mov bx, 10000 ;除数 mov cx, 10 ;除数系数 mov si, 4 ;目的数据高位位移量
again: mov ax, dx ;dx.ax中存放被除数
〔习题3.26〕
过程定义的一般格式是怎样的?子程序开始为什么常有PUSH指令、返回前为什么常有POP指令?下面完成16位无符号数累加的子程序有什么不妥吗?若有,请改正:
crazy
mov dx, 0
div bx ;除于bx,商ax,余数dx mov dbcd[si], al ;商<10,存结果 push dx ;暂存余数
mov ax, bx ;除数除于10
mov dx,0
div cx ;dx.ax除于cx,商ax、余数0存在dx mov bx, ax ;bx是除数 pop dx
dec si ;目的数据位移量减1 jnz again
mov dbcd, dl ;存个位数( < 10 ) .exit 0 end
PROC
22
push ax xor ax,ax xor dx,dx
again: add ax,[bx] adc dx,0 inc bx inc bx loop again ret ENDP crazy 〔解答〕
crazy PROC ;crazy PROC push ax ; xor ax,ax ; xor ax,ax xor dx,dx ; xor dx,dx
again: add ax,[bx] ;again: add ax,[bx] adc dx,0 ; adc dx,0 inc bx ; inc bx inc bx ; inc bx loop again ; loop again ret ; ret ENDP crazy ; crazy 〔习题3.27〕
ENDP
编写一个源程序,在键盘上按一个键,将从AL返回的ASCII码值显示出来,如果按下ESC键则程序退出。请调用书中的HTOASC子程序。 〔解答〕
again: mov ah,1 int 21h cmp al,1bh ;ESC的ASCII码是1bh
je done mov dl,al mov ah,2
int 21h ;是大写字母则转换为小写字母
jmp again done: …
23
〔习题3.28〕
请按如下说明编写子程序: ;子程序功能:把用ASCII码表示的两位十进制数转换为对应二进制数 ;入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码 ;出口参数:AL=对应的二进制数 〔解答〕
asctob proc push cx and dh,0fh ;先转换十位数 shl dh,1 ;十位数乘以10(采用移位指令)
mov ch,dh shl dh,1 shl dh,1 add dh,ch and dl,0fh ;转换个位数 add dh,dl ;十位数加个位数 mov al,dh;设置出口参数
pop cx ret
asctob endp
〔习题3.29〕
调用HTOASC子程序,编写显示一个字节的16进制数、后跟“H”的子程序。 〔解答〕
DIPASC proc ;入口参数:AL=要显示的一个16进制数
push cx push dx push ax
mov cl,4 ;转换高位 shr al,cl
call HTOASC mov dl,al ;显示 mov ah,2 int 21h
pop ax ;转换低位 call HTOASC mov dl,al ;显示
24
相关推荐: