16/32位微机原理、汇编语言及接口技术课后习题答案 联系客服

发布时间 : 星期三 文章16/32位微机原理、汇编语言及接口技术课后习题答案更新完毕开始阅读

next1:

next2:

解:

restart:

again:

next:

fun0:

fun1:

fun2:

fun3:

fun4:

fun5:

fun6:

fun7:

disp:

dec dl

cmp ax,bufZ je next2 dec dl mov ah,2 int 21h

;代码段

mov al,number mov bx,0 ;BX←记录为1的位数 cmp al,0 ;AL=0结束 jz done shr al,1 ;最低位右移进入CF jc next ;为1,转移 inc bx ;不为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

jmp restart

done: …

编制程序完成12H、45H、0F3H、6AH、20H、0FEH、90H、0C8H、57H和34H等10个字节数据之和,并将结果存入字节变量SUM中(不考虑溢出和进位)。 ; .model small .stack .data b_data db 12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h ;原始数据 num equ 10 ;数据个数 sum db ? ;预留结果单元 .code .startup xor si, si ;位移量清零 xor al, al ;取第一个数 mov cx, num ;累加次数 again: add al, b_data[si] ;累加 inc si ;指向下一个数 loop again ;如未完,继续累加 mov sum, al ;完了,存结果 .exit 0 end

求主存0040h:0开始的一个64KB物理段中共有多少个空格? ; .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

编写计算100个16位正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示‘overflow’。 答: ;数据段

count equ 100 parray 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 done: …

编程把—个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数。转换算法可以是:用二进制数除以10000,商为“万位”,再用余数除以1000,得到“千位”;依次用余数除以l00、10和l,得到“百位”、“十位”和“个位”。 ; .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 ;中存放被除数 mov dx, 0 div bx ;除于bx,商ax,余数dx mov dbcd[si], al ;商<10,存结果 push dx ;暂存余数 mov ax, bx ;除数除于10 mov dx,0 div cx ;除于cx,商ax、余数0存在dx mov bx, ax ;bx是除数 pop dx

dec si ;目的数据位移量减1 jnz again mov dbcd, dl ;存个位数( < 10 ) .exit 0 end

解:

(1)汇编语言中,子程序要用一对过程伪指令PROC和ENDP声明,格式如下: 过程名 PROC [NEAR|FAR]

…… ;过程体 过程名 ENDP

(2)保护用到的寄存器内容,以便子程序返回时进行相应的恢复。 (3)改错: crazy proc

pish bx push cx xor ax,ax xor dx,dx again:add a,[bx] adc dx,0 inc bx inc bx

loop again pop cx pop bx

解(不需调用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: …

解答: asctob proc push cx and dh,0fh ;先转换十位数 shl dh,1 ;十位数乘以10(采用移位指令) mov ch,dh shl dh,1