计算机网络原理第三章部分习题参考答案_计算机网络习题第3章
计算机网络原理第三章部分习题参考答案由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“计算机网络习题第3章”。
第3章
汇编语言程序设计(习题3)
3.16 解:
3.17 解:
3.18 解:
done:
3.19 解:
bufX signX
next: done:
3.20 解:
mov ah,1 ;只允许输入小写字母 int 21h sub al,20h ;转换为大写字母
mov dl,al mov ah,2 int 21h
;显示
mov bx,offset LEDtable mov al,lednum xlat mov ax, bufX cmp ax, bufY jae done mov ax, bufY mov bufZ, ax.model small.stack.data dw-7 db ?.code.startup cmp bufX,0;test bufX,80h jl next
;jnz next mov signX,0 jmp done mov signX,-1.exit 0 end mov dl,’2’ mov ax,bufX cmp ax,bufY
next1:
next2:
3.21 解:
restart:
again:
next:
fun0:
fun1:
fun2:
fun3:
fun4:
fun5:
fun6:
fun7:
disp:
je next1 dec dl cmp ax,bufZ je next2 dec dl mov ah,2 int 21h;代码段 mov al,number mov bx,0 cmp al,0 jz done shr al,1 jc next inc bx
;BX←记录为1的位数;AL=0结束;最低位右移进入CF;为1,转移;不为1,继续
jmp again push ax push bx shl bx,1;位数乘以2(偏移地址要用2个字节单元)jmp addrs[bx];间接转移:IP←[table+BX];以下是各个处理程序段 mov dl,'0' jmp disp mov dl,'1' jmp disp mov dl,'2' jmp disp mov dl,'3' jmp disp mov dl,'4' jmp disp mov dl,'5' jmp disp mov dl,'6' jmp disp mov dl,'7' jmp disp;mov ah,2 int 21h pop bx pop ax
;显示一个字符
done: jmp restart …
3.22 编制程序完成12H、45H、0F3H、6AH、20H、0FEH、90H、0C8H、57H和34H等10个字节数据之和,并将结果存入字节变量SUM中(不考虑溢出和进位)。
;wjxt322.asm
b_data num sum
again:
.model small.stack.data db 12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h ;原始数据 equ 10 ;数据个数 db ? ;预留结果单元.code.startup xor si, si xor al, al mov cx, num add al, b_data[si] inc si loop again mov sum, al.exit 0 end
;位移量清零 ;取第一个数 ;累加次数 ;累加
;指向下一个数 ;如未完,继续累加 ;完了,存结果
3.23 求主存0040h:0开始的一个64KB物理段中共有多少个空格?;wjxt323.asm.model small.code start: mov ax,0040h
again:
next:
;送段地址
mov ds, ax mov si, 0 ;偏移地址 mov cx, si ;计数(循环次数)xor ax, ax ;空格计数器清零
cmp byte ptr [si], 20h ;与空格的ASCII码比较 jne next ;不是空格,转 inc ax ;是空格,空格数加1 inc si ;修改地址指针 loop again ;cx=cx-1,如cx=0 退出循环.exit 0 end start
3.24 编写计算100个16位正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示‘overflow’。答: count parray ;数据段 equ 100 dw count dup(?)
;假设有100个数据
wordsum dw 0 msg db ‘overflow’,’$’
;代码段
again:
next:
done: mov cx,count mov ax,0 mov bx,offset parray add ax,[bx] jnc next mov dx,offset msg mov ah,9 int 21h ;显示溢出信息 jmp done ;然后,跳出循环体 add bx,2 loop again mov wordsum,ax …
3.25 编程把—个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数。转换算法可以是:用二进制数除以10000,商为“万位”,再用余数除以1000,得到“千位”;依次用余数除以l00、10和l,得到“百位”、“十位”和“个位”。
;wjxt325.asm
.model small
.stack 256
.data array dw ? dbcd db 5 dup(?)
again:
.code.startup
mov dx, array mov bx, 10000 mov cx, 10 mov si, 4 mov ax, dx mov dx, 0 div bx mov dbcd[si], al push dx mov ax, bx mov dx,0 div cx mov bx, ax
;源字数据
;五位bcd结果,高对高低对低
;取源数据(余数)
;除数
;除数系数
;目的数据高位位移量
;dx.ax中存放被除数
;除于bx,商ax,余数dx ;商<10,存结果
;暂存余数 ;除数除于10
;dx.ax除于cx,商ax、余数0存在dx ;bx是除数
pop dx dec si jnz again mov dbcd, dl.exit 0 end
;目的数据位移量减1 ;存个位数(
3.27 解(不需调用HTOASC子程序):
again:
done: mov ah,1 int 21h cmp al,1bh je done mov dl,al mov ah,2 int 21h jmp again …
;ESC的ASCII码是1bh
;是大写字母则转换为小写字母
3.28 请按如下说明编写子程序:
;子程序功能:把用ASCII码表示的两位十进制数转换为对应二进制数 ;入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码 ;出口参数:AL=对应的二进制数 答:
asctob
asctob proc push cx and dh,0fh shl dh,1 mov ch,dh shl dh,1 shl dh,1 add dh,ch and dl,0fh add dh,dl mov al,dh pop cx ret endp
;先转换十位数
;十位数乘以10(采用移位指令)
;转换个位数 ;十位数加个位数 ;设置出口参数
3.29 解:
DIPASC proc
push cx push dx push ax mov cl,4
;入口参数:AL=要显示的一个16进制数
;转换高位 shr al,cl call HTOASC mov dl,al mov ah,2 int 21h pop ax call HTOASC mov dl,al mov ah,2 int 21h mov dl,’H’
mov ah,2 int 21h pop dx pop cx ret DIPASC endp HTOASC proc and al,0fh cmp al,9 jbe htoasc1 add al,37h ret htoasc1: add al,30h ret HTOASC endp
3.30 解: lucase proc push bx mov bx,offset string cmp al,0 je case0 cmp al,1 jz case1 cmp al,2 jz case2 jmp done case0: cmp byte ptr [bx],0 je done cmp byte ptr [bx],’A’ jb next0 cmp byte ptr [bx],’Z’ ja next0
;显示
;转换低位 ;显示
;显示一个字母“H”
;将AL低4位表达的一位16进制数转换为ASCII码;是0AH~0FH,加37H转换为ASCII码;子程序返回
;是0~9,加30H转换为ASCII码;子程序返回
next0:
case1:
next1:
case2:
next20:
next2:
done:
lucase
3.33 解:方法1: neg32
neg32 方法2: neg32
add byte ptr [bx],20h inc bx jmp case0 cmp byte ptr [bx],0 je done cmp byte ptr [bx],’a’ jb next1 cmp byte ptr [bx],’z’ ja next1 sub byte ptr [bx],20h inc bx jmp case1 cmp byte ptr [bx],0 je done cmp byte ptr [bx],’A’ jb next2 cmp byte ptr [bx],’Z’ ja next20 add byte ptr [bx],20h jmp next2 cmp byte ptr [bx],’a’ jb next2 cmp byte ptr [bx],’z’ ja next2 sub byte ptr [bx],20h inc bx jmp case2 pop bx ret endp proc ;入口参数:DX.AX=32位有符号数 neg ax ;实现0-DX.AX功能 neg dx sbb dx,0 ;这条指令也可以用dec dx代替
ret endp ;出口参数:DX.AX=32位有符号数的补码proc ;入口参数:DX.AX=32位有符号数 not ax ;实现DX.AX求反加1 not dx add ax,1
neg32
3.34 解:
array count result
adc dx,0 ret endp
;出口参数:DX.AX=32位有符号数的补码
;数据段
db 12h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90h;数组 equ $-array;数组元素个数 db ?;校验和;代码段
mov bx,offset array;BX←数组的偏移地址 mov cx,count;CX←数组的元素个数 call checksum;调用求和过程 mov result,al;处理出口参数
mov ax,4c00h int 21h;计算字节校验和的通用过程
;入口参数:DS:BX=数组的段地址:偏移地址,CX=元素个数;出口参数:AL=校验和
;说明:除AX/BX/CX外,不影响其他寄存器 proc xor al,al add al,[bx] inc bx loop sum ret endp end
;累加器清0;求和
;指向下一个字节 checksum sum:
checksum
3.35 解:
⑴
wdata
dispa.model small.stack.data dw 34abh.code.startup mov ax,wdata call dispa.exit 0;proc push cx push dx
dispa
dldisp
dldisp1:
dldisp ⑵
wdata wordtemp
dispa mov cl,4 mov dl,ah shr dl,cl call dldisp mov dl,ah and dl,0fh call dldisp mov dl,al shr dl,cl call dldisp mov dl,al and dl,0fh call dldisp pop dx pop cx ret endp;proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7 mov ah,2 int 21h pop ax ret endp end.model small.stack.data dw 34abh dw ?.code.startup mov ax,wdata mov wordtemp,ax call dispa.exit 0;proc
dispa
dldisp
dldisp1:
dldisp ⑶
wdata
push cx push dx mov cl,4 mov dl,byte ptr wordtemp+1 shr dl,cl call dldisp mov dl,byte ptr wordtemp+1 and dl,0fh call dldisp mov dl,byte ptr wordtemp shr dl,cl call dldisp mov dl,byte ptr wordtemp and dl,0fh call dldisp pop dx pop cx ret endp;proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7 mov ah,2 int 21h pop ax ret endp end.model small.stack.data dw 34abh.code.startup push wdata call dispa pop ax.exit 0;
;add sp,2 dispa proc push bp mov bp,sp push ax push cx push dx mov ax,[bp+4] mov cl,4 mov dl,ah shr dl,cl call dldisp mov dl,ah and dl,0fh call dldisp mov dl,al shr dl,cl call dldisp mov dl,al and dl,0fh call dldisp pop dx pop cx pop ax pop bp ret dispa endp;dldisp proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7 dldisp1: mov ah,2 int 21h pop ax ret dldisp endp end
3.40 编写一个宏指令move doprnd,soprnd,它实现任意寻址方式的字量源操作数soprnd送到目的操作数doprnd,包括存储单元到存储单元的传送功能。
答:
move macro doprnd,soprnd
mov ax,soprnd mov doprnd,ax endm
3.41 定义一个宏logical,用它代表4条逻辑运算指令:and/or/xor/test。注意需要利用3个形式参数,并给出一个宏调用以及对应宏展开的例子。
答:
logical macro lcode,dopd,sopd lcode dopd,sopd endm 例如,如果使用“and ax,[bx]”指令,可以利用该宏定义,写出宏指令如下:
3.42 解:
utol
next: macro local next cmp al,’A’ jb next cmp al,’Z’ ja next add al,20h
endm logical and,ax,[bx]
;小于“A”不转换 ;大于“A”不转换
;是大写字母则转换为小写字母
3.43 定义一个宏movestr strn,dstr,tr,它将strn个字符从一个字符区tr传送到另一个字符区dstr 解:(假设它们都在数据段)
movestr
macro strn,dstr,tr mov cx,ds mov es,cx mov cx,strn mov di,offset dstr mov si,offset tr cld rep movsb ;;重复传送ES:[DI]←DS:[SI] endm