loop count1
ret
countAX endp
;=============================
题3.22 设一个32位有符号数存放在DX:AX中,请写一个求其补码的程序片段。
答: Invert proc mov bx,dx and bx,8000h cmp bx,0 jz out_1 not dx not ax add ax,1 adc dx,0 or dx,8000h out_1:
nop ret
Invert endp
题3.23 写一个程序片段实现如下功能:依次重复寄存器AL中的每一位,得到16位的结果存
放到DX寄存器中。
答: Expand proc mov cx,7 xor dx,dx S0:
shl dx,1 shl dx,1 shl al,1 jnc CF0 add dx,3h CF0: nop loop S0 ret
Expand endp
题3.24 写一个程序片段实现如下功能:依次重复四次寄存器AL中的每一位,得到32位的结果
存放到DX:AX寄存器中。
答: Expand proc mov cx,3 xor dx,dx xor bx,bx S0: shl al,1 jnc CF0 add dx,0Fh CF0: shl dx,1 shl dx,1 shl dx,1 shl dx,1 loop S0
mov cx,4 S1: shl al,1 jnc CF0_1 add bx,0Fh CF0_1: shl bx,1 shl bx,1 shl bx,1 shl bx,1 loop S1 mov ax,bx ret Expand endp
题3.25 写一个程序片段实现如下功能:把寄存器AL和BL中的位依次交叉,得到的16位结果
存放到DX寄存器中。
答: Expand proc mov cx,8 xor dx,dx S0:
shl dx,1 shl al,1 jnc CF0 add dx,1h
CF0: shl dx,1 shl bl,1 jnc CF0_1 add dx,1h CF0_1: loop S0 ret
Expand endp
题3.26 写一个优化的程序片段,实现把字符串中的小写子母变换为对应的大写子母。设字符串
以0结尾。
答: InvertC proc begin:
mov al,mess[si] cmp al,'0' jz exit_1 cmp al,61h jb next
cmp al,7AH ja next
and al,11011111b mov mess[si],al next: inc si jmp begin exit_1: nop ret
InvertC endp
题3.27 写一个优化的程序片段,统计字符串的长度。设字符串以0结尾。 答: count proc mov al,mess[si] cmp al,'0' jz exit_2 inc si jmp count exit_2:
nop ret
count endp ;si=数量
题3.28 写一个程序片段,滤去某个字符串中的空格符号(ASCII码20H),设字符串以0结尾。
答: DeleteSpace proc ;设si=0,bx=0,Mess为字符串首地址 mov al,mess[si] cmp al,'0' jz exit_2 cmp al,' ' jz next3 xchg al,mess[bx] xchg al,mess[si] inc bx next3: inc si
jmp DeleteSpace exit_2:
nop ret
DeleteSpace endp
题3.29 请写一个把两个字符串合并的示例程序。 答: dseg segment string1 db 'Welcome to $' string2 db 'Beijing !$' dseg ends
cseg segment
assume cs:cseg,ds:dseg start:
mov ax,dseg mov ds,ax
xor bx,bx xor si,si
keepfind:
mov al,string1[bx] cmp al,'$' jz combine inc bx jmp keepfind combine:
mov al,string2[si] mov string1[bx],al cmp al,'$'
相关推荐: