微机原理与接口技术课后习题答案(郭兰英) 下载本文

. . . .

41h

3.9 解:

(1) al=67h

(2) ax=133h,dx=4h (3) ax=0230h (4) al=41h (4) ax=7654h

3.10 解: (1) 441145h 46h -1 ? 4 4 4 -1 ? 4 4 4 -1 230 0h h h (2) 10h 00h 0fbh 0ffh ? ? ? ? ? 3.11 解:.data

my1b db 'Personal Computer' my2b db 20 my3b db 14h

my4b db 00010100b my5w dw 20 dup(?) my6c = 100

my7c = <'Personal Computer'>

3.12 解:

利用定位伪指令控制,如org,even,align

3.13 解:

包括逻辑地址和类型两种属性。

3.14 解: ;数据段

org 100h

varw dw 1234h , 5678h varb db 3 , 4 vard dd 12345678h buff dd 10 dup(?) mess db 'Hello' ;代码段

mov ax , offset varb + offset mess

mov ax , type buff + type mess + type vard mov ax , sizeof varw+ sizeof buff+ sizeof mess

? 4 4 4 ? 参考

. . . .

mov ax , lengthof varw+ lengthof vard

3.15 解:

(1) 1000超过一个字节所能表达的最大整数 (2)SI应为偶数

(3)两个内存单元不能直接运算 (4)应改为[al+1]

(5)条件转移指令后面应接标号,而不是变量

3.16 解:

3.17 解:

3.18 解: done:

3.19 解: bufX signX next: done: 参考

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

3.20 解:

next1:

next2:

3.21 解:

restart:

again:

next:

fun0:

fun1:

fun2:

fun3:

fun4:

fun5:

fun6:

fun7:

参考

. . . .

mov dl,’2’ mov ax,bufX cmp ax,bufY je next1 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

. . . .

; disp: mov ah,2 ;显示一个字符 int 21h pop bx pop ax jmp restart done: …

3.22 编制程序完成12H、45H、0F3H、6AH、20H、0FEH、90H、0C8H、57H和34H等10个字节数据之和,并将结果存入字节变量SUM中(不考虑溢出和进位)。 ;wjxt322.asm .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

3.23 求主存0040h:0开始的一个64KB物理段中共有多少个空格? ; 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位正整数之和的程序。如果和不超过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: …

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

参考