汇编答案

更新时间:2024-05-20 10:35:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

汇编答案

习题1.5〕将下列十六进制数转换为二进制和十进制表示

(1)FFH (2)0H (3)5EH (4)EFH

(5)2EH (6)10H (7)1FH (8)ABH 答 (1)FFH 11111111B 255D

(2)0H 0B 0D (3)5EH 1011110B 94D (4)EFH 11101111B 239D (5)2EH 101110B 46D (6)10H 10000B 16D (7)1FH 11111B 31D (8)ABH 10101011B 171D 〔习题1.6〕

将下列十进制数转换为BCD码表示

(1)12 (2)24 (3)68 (4)127 (5)128 (6)255 (7)1234 (8)2458 答 (1)12 00010010

(2)24 00100100 (3)68 01101000 (4)127 000100100111 (5)128 000100101000 (6)255 001001010101 (7)1234 0001001000110100 (8)2458 0010010001011000

〔习题1.7〕

将下列BCD码转换为十进制数

(1)10010001 (2)10001001 (3)00110110 (4)10010000 (5)00001000 (6)10010111 (7)10000001 (8)00000010〔解答〕 (1)91 (2)89 (3)36 (4)90 (5)08 (6)97 (7)81 (8)02

〔习题1.8〕将下列十进制数分别用8位二进制数的原码、反码和补码表示

(1)0 (2)-127 (3)127 (4)-57

(5)126 (6)-126 (7)-128 (8)68 (1)0 +0 00000000 00000000 00000000 -0 10000000 11111111 00000000 (2)-127 11111111 10000000 10000001 (3)127 01111111 01111111 01111111

(4)-57 10101111 11010000 11010001 (5)126 01111110 01111110 01111110 (6)-126 11111110 10000001 10000010 (7)-128 10000000 (8)68 01000100 01000100 01000100 〔习题1.9〕完成下列二进制数的运算

(1)1011+1001 (2)1011-1001 (3)1011×1001 (4)10111000÷1001 (5)1011 ∧1001 (6)1011 ∨1001 (7)~1011 (8)1011 ? 1001 答(1)1011+1001=10100 (2)1011-1001=0010 (3)1011×1001=1100011

(4)10111000÷1001=10100,余数 1000 (5)1011 ∧ 1001=1001 (6)1011 ∨1001=1011 (7)~1011=0100

(8) 1011?1001=0010(?代表异或)

〔习题1.10〕数码0~9、大写字母A~Z、小写字母a~z对应的ASCII码分别是多少?ASCII码为0dh、0ah对应的是什么字符?

答:数码0~9:30H~39H 大写字母A~Z:41H~5AH 小写字母a~z:61H~7AH

ASCII码为0dh、0ah分别对应回车和换行控制字符。

〔习题1.11〕计算机中有一个“01100001”编码,如果把它认为是无符号数,它是十进制什么数?如果认为它是BCD码,则表示什么数?又如果它是某个ASCII码,则代表哪个字符?

答:十进制无符号数:01100001B=61H=97

BCD码:61 ASCII码:a

〔习题1.17〕举例说明CF和OF标志的差异。

答:溢出标志OF和进位标志CF是两个意义不同的标志。

进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确。

例1:3AH + 7CH=B6H

无符号数运算:58+124=182,范围内,无进位 有符号数运算: 58+124=182 ,范围外,有溢出 例2:AAH + 7CH=(1)26H

无符号数运算:170+124=294,范围外,有进位 有符号数运算:-86+124=28 ,范围内,无溢出

习题1.19〕什么是8086中的逻辑地址和物理地址?逻辑地址如何转换成物理地址?请将如下逻辑地址用物理地址表达:

(1)FFFFh:0 (2)40h:17h (3)2000h:4500h (4)B821h:4567h

答:在8086处理器中,对应每个物理存储单元都有一个唯一的20位编号,就是物理地址,从00000H~FFFFFH。

在8086内部和用户编程时,采用的段基地址 : 段内偏移地址形式称为逻辑地址。

将逻辑地址中的段地址左移二进制4位(对应16进制是一位,即乘以16),加上偏移地址就得到20位物理地址

如下逻辑地址用物理地址表达: (1)FFFFh:0=FFFF0H (2)40h:17h=00417H (3)2000h:4500h=24500H

(4)B821h:4567h=BC777H (不要算错)

〔习题1.24〕说明下列指令中源操作数的寻址方式?如果BX=2000H,DI=40H,给出DX的值或有效地址EA的值。

(1) mov dx,[1234h]

(2) mov dx,1234h (3) mov dx,bx (4) mov dx,[bx] (5) mov dx,[bx+1234h] (6) mov dx,[bx+di]

(7) mov dx,[bx+di+1234h]〔解答〕 (1)直接寻址,EA=1234H (2)立即数寻址,DX=1234H (3)寄存器寻址,DX=2000H (4)间接寻址,EA=2000H (5)相对寻址,EA=3234H (6)基址变址寻址,EA=2040H (7)相对基址变址寻址,EA=3274H

习题2.1〕已知DS=2000H、BX=0100H、SI=0002H,存储单元[20100H]~[20103H]依次存放12 34 56 78H,[21200H]~[21203H]依次存放2A 4C B7 65H,说明下列每条指令执行完后AX寄存器的内容。

(1) mov ax,1200h (2) mov ax,bx (3) mov ax,[1200h] (4) mov ax,[bx] (5) mov ax,[bx+1100h] (6) mov ax,[bx+si]

(7) mov ax,[bx][si+1100h]〔解答〕 (1)AX=1200H (2)AX=0100H

(3)AX=4C2AH ;偏移地址=bx=0100h (4)AX=3412H ;偏移地址=bx=0100h (5)AX=4C2AH ;偏移地址=bx+1100h=1200h

(6)AX=7856H ;偏移地址=bx+si=0100h+0002h=0102h

(7)AX=65B7H ;偏移地址=bx+si+1100h=0100h+0002h+1100h=1202h 〔习题2.2〕指出下列指令的错误

(1) mov cx,dl (2) mov ip,ax (3) mov es,1234h (4) mov es,ds (5) mov al,300 (6) mov [sp],ax (7) mov ax,bx+di

(8) mov 20h,ah 〔解答〕 (1)两操作数类型不匹配 (2)IP指令指针禁止用户访问 (3)立即数不允许传给段寄存器 (4)段寄存器之间不允许传送 (5)两操作数类型不匹配 (6)目的操作数应为[ SI ] (7)源操作数应为 [BX+DI] (8)立即数不能作目的操作数

〔习题2.6〕给出下列各条指令执行后AL值,以及CF、ZF、SF、OF和PF的状态: mov al,89h add al,al add al,9dh cmp al,0bch sub al,al dec al

inc al 〔解答〕

mov al,89h ; AL=89h CF ZF SF OF PF add al,al ; AL=12h 1 0 0 1 1 ; 1000 1001 +1000 1001 10001 0010

add al,9dh ; AL=0afh 0 0 1 0 1 ; 0001 0010

+ 1001 1101 1010 1111

cmp al,0bch ; AL=0afh 1 0 1 0 1 ; 1010 1111 -1011 1100 * 0100 0011

sub al,al ; AL=00h 0 1 0 0 1 dec al ; AL=0ffh 0 0 1 0 1 ; 0000 0000 - 0000 0001 *1111 1111

inc al ; AL=00h 0 1 0 0 1 ;1111 1111 +0000 0001

*1111 1111

〔习题2.7〕设X、Y、Z均为双字数据,分别存放在地址为X、X+2;Y、Y+2;Z、Z+2的存储单元中,它们的运算结果存入W单元。阅读如下程序段,给出运算公式。

mov ax,X mov dx,X+2 add ax,Y adc dx,Y+2 add ax,24 adc dx,0 sub ax,Z sbb dx,Z+2 mov W,ax

mov W+2,dx 〔解答〕 W=X+Y+24-Z

〔习题2.8〕请分别用一条汇编语言指令完成如下功能:

(1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。

(2)用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。

(3)用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存储器中。

(4)用位移量为0520H的直接寻址方式把存储器中的一个字与数3412H相加,并把结果送回该存储单元中。

(5)把数0A0H与AL寄存器的内容相加,并把结果送回AL中。〔解答〕 (1)ADD DX,BX (2)ADD AL,[BX+SI] (3)ADD [BX+0B2H],CX

(4)ADD WORD PTR [0520H],3412H

(5)ADD AL,0A0H

〔习题2.9〕设X、Y、Z、V均为16位带符号数,分别装在X、Y、Z、V存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处。

mov ax,X ;ax=X imul Y ;DX.AX=X*Y mov cx,ax ;cx=X*Y的低16位 mox bx,dx ;bx=X*Y的高16位 mov ax,Z ;ax=Z cwd

add cx,ax ;cx=Z的低16位+X*Y的低16位

adc bx,dx ;bx=Z的高16位+X*Y的高16位+低位进位 sub cx,540 ;cx=Z的低16位+X*Y的低16位-540

sbb bx,0 ;bx=Z的高16位+X*Y的高16位+低位进位-低位借位 mov ax,V ;ax=V cwd

sub ax,cx ;ax=V的低16位-(Z的低16位+X*Y的低16位-540)

sbb dx,bx ;dx=V的高16位-(Z的高16位+X*Y的高16位+低位进位-低位借位)-低位借位

idiv X ;/X〔解答〕 [V-(X*Y+Z-540)]/X AX存商,DX存余数

〔习题2.10〕指出下列指令的错误:

(1) xchg [si],30h (2) pop cs (3) sub [si],[di] (4) push ah (5) adc ax,ds (6) add [si],80h (7) in al,3fch

(8) out dx,ah〔解答〕 (1)xchg的操作数不能是立即数 (2)不应对CS直接赋值

(3)两个操作数不能都是存储单元 (4)堆栈的操作数不能是字节量 (5)adc的操作数不能是段寄存器 (6)没有确定是字节还是字操作 (7)in不支持超过FFH的直接寻址

(8)out只能以AL/AX为源操作数

〔习题2.13〕编写程序段完成如下要求:

(1)用位操作指令实现AL(无符号数)乘以10

(2)用逻辑运算指令实现数字0 ~ 9的ASCII码与非压缩BCD码的互相转换 (3)把DX.AX中的双字右移4位〔解答〕 (1) ;不考虑进位 mov bl,al mov cl,3

shl al,cl ;*8 add al,bl ;shl bl,1 add al,bl ;考虑进位 xor ah,ah mov bx,ax mov cl,3 shl ax,cl

add ax,bx ;shl bx,1 add ax,bx

(2)数字0~9的ASCII码是:30h~39h 非压缩BCD码的0~9是:00h~09h 方法一:

and al,0fh ;实现ASCII到非压缩BCD码的转换 or al,30h ;实现非压缩BCD码到ASCII的转换 方法二:

xor al,30h ;求反D5D4位,其他不变 ;即高4位为3,则变为0;高4位为0,则变为3 (3) mov cl,4

again: shr dx,1 ;实现逻辑右移

;采用“sar dx,1”,则实现算术右移 rcr ax,1 dec cl jnz again

〔习题3.9〕假设myword是一个字变量,mybyte1和mybyte2是两个字节变量,指出下列语句中的错误原因。

(1) mov byte ptr [bx],1000

(2) mov bx,offset myword[si] (3) cmp mybyte1,mybyte2 (4) mov al,mybyte1+mybyte2

(5) sub al,myword (6) jnz myword〔解答〕 (1)1000超出了一个字节范围

(2)寄存器的值只有程序执行时才能确定,而offset是汇编过程计算的偏移地址,故无法确定,改为lea bx,myword[si]

(3)两个都是存储单元,指令不允许

(4)变量值只有执行时才确定,汇编过程不能计算 (5)字节量AL与字量myword,类型不匹配

(6)Jcc指令只有相对寻址方式,不支持间接寻址方式 习题3.14〕画图说明下列语句分配的存储空间及初始化的数据值:

(1) byte_var DB ?ABC?,10,10h,?EF?,3 DUP(-1,?,3 DUP(4))

(2) word_var DW 10h,-5,?EF?,3 DUP(?)〔解答〕 (1)从低地址开始,依次是(十六进制表达):

41 42 43 0a 10 45 46 ff - 04 04 04 ff - 04 04 04 ff - 04 04 04 (2)从低地址开始,依次是(十六进制表达): 10 00 FB FF 46 45 - - - - - -

〔习题3.19〕设在某个程序中有如下片段,请写出每条传送指令执行后寄存器AX的内容:

mydata segment

ORG 100H VARW DW 1234H,5678H VARB DB 3,4 ALIGN 4 VARD DD 12345678H EVEN BUFF DB 10 DUP(?) MESS DB ?HELLO?

BEGIN: MOV AX,OFFSET MESS

MOV AX,TYPE BUFF+TYPE MESS+TYPE VARD MOV AX,SIZEOF VARW+SIZEOF BUFF+SIZEOF MESS MOV AX,LENGTHOF VARW+LENGTHOF VARD MOV AX,LENGTHOF BUFF+SIZEOF VARW MOV AX,TYPE BEGIN

MOV AX, OFFSET BEGIN 〔解答〕

MOV AX, OFFSET MESS ;AX=116H

MOV AX, TYPE BUFF+TYPE MESS+TYPE VARD ;AX = 1+1+4 = 06H

MOV AX,SIZEOF VARW+SIZEOF BUFF+SIZEOF MESS ;AX = 4+10+5 = 19 = 13H MOV AX,LENGTHOF VARW + LENGTHOF VARD ;AX = 2+1 = 03H MOV AX,LENGTHOF BUFF + SIZEOF VARW ;AX = 10+4 =14 = 0EH MOV AX,TYPE BIGIN ;AX = FF02H (近)

MOV AX,OFFSET BEGIN ;AX = 1BH

习题3.25〕按下面要求写一个简化段定义格式的源程序

(1) 定义常量num,其值为5;数据段中定义字数组变量datalist,它的头5个字单元中依次存放-1、0、2、5和4,最后1个单元初值不定;

(2) 代码段中的程序将datalist中头num个数的累加和存入datalist的最后1个字单元中。〔解答 .model small

.stack .data num equ 5 datalist dw -1,0,2,5,4,? .code .startup

mov bx,offset datalist mov cx,num xor ax,ax

again: add ax,[bx] inc bx inc bx loop again mov [bx],ax .exit 0 end

〔习题4.1〕例题4.2如果要求算术右移8位,如何修改程序。 〔解答〕

思路: 首先由最高位字节向次低位字节传送……次低位字节向最低位字节传送(共7次);再判最高位字节符号位,如为0,送00h到最高位字节;如为1,送ffh到最高位字节。传送可参考例题4.2,不过应从第一号字节送第零号字节,……最高位字节向次低位字节传送;也可以用循环来完成:

.model small .stack 256 .data

qvar dq 1234567887654321h .code .startup mov cx,7 mov si,1

again: mov al, byte ptr qvar[si] mov byte ptr qvar[si-1],al inc si loop again test al,80h jz ezz

mov bl,0ffh jmp done ezz: mov bl,0

done: mov byte ptr qvar[7],bl .exit 0

end

〔习题4.2〕例题4.2如果要求算术左移7位,如何用移位指令实现。 〔解答〕

思路:可设计外循环体为8个字节左移一次,方法是:最低位字节算术左移一次, 次低位字节至最高位字节依次带 CF 位循环左移一次(内循环共8次),外循环体控制执行7次即可。

.model small .stack 256 .data

qvar dq 1234567887654321h .code .startup

mov dx, 7 ;外循环次数 mov ax, byte ptr qvar[0] ;最低位字节送ax

lpp: shl ax, 1 ;最低位字节左移一次,其d7移入CF位 mov si, 1

mov cx, 7 ;内循环次数

again: rcl byte ptr qvar[si], 1 ;高位字节依次左移 P50 inc si loop again dec dx jnz lpp .exit 0

.end

〔习题4.3〕将AX寄存器中的16位数连续4位分成一组,共4组,然后把这4组数分别放在AL、BL、CL和DL寄存器中。〔解答〕

思路:设这四组从低位到高位分别放在AL、BL、CL和DL寄存器中。仅列出代码段: mov bl, al ;将al中的两组分开 and al, 0fh ;屏蔽高四位后送al

mov cl, 4 ;原al中的数据逻辑右移4次送bl shr bl, cl

mov dl, ah ;将ah中的两组分开 and dl, 0f0h ;屏蔽低高四位后送dl

mov cl, 4 ;原ah中的数据逻辑右移4次送dl shr dl, cl

mov cl, ah ;屏蔽高四位后送cl

and cl, 0fh

〔习题4.4〕编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来。 〔解答〕

getkey: mov ah, 1 ;从键盘输入,出口:al存键值 int 21h

cmp al, 'a' ;判键值是小写字母? jb getkay cmp al, 'z' ja getkay

sub al,20h ;是小写字母转换为大写字母 mov dl,al

mov ah, 02h ;显示 int 21h

编程实现把键入的一个字符,用二进制形式(0 / 1)显示出它的ASCII代码值。 〔解答〕 .model small .stack 256 .data

stri1 db 'please input',0dh,0ah,'$' .code .startup

mov dx,offset stri1 mov ah,09h int 21h

mov ah, 01h int 21h mov cx, 8 again: xor dl,dl shl al, 1 adc dl, '0' mov ah,02h int 21h loop again .exit 0

end

〔习题4.17〕编写程序,要求从键盘接收一个数bellN(0 ~ 9),然后响铃bellN次。 〔解答〕

.model small .stack .data

stri1 db 'please input number:1--9',0dh,0ah,'$' .code

.startup

again: mov dx,offset stri1 ;显示stri1,提示输入 mov ah,09h int 21h

mov ah,01h ;调用输入一个字符 int 21h ;输入一个字符存在al中 cmp al, '1' ;判该字符,如不在?1?--?9? jb again ;重新输入 cmp al, '9' ja again

and al,0fh ;在?1?--?9?,屏蔽高4位 mov cl, al ;振铃次数送cx xor ch,ch

abc: mov dl, 07h ;调用一次振铃 mov ah, 02h int 21h loop abc .exit 0

end

〔习题4.18〕编写程序,将一个包含有20个有符号数据的数组arrayM分成两个数组:正数数组arrayP和负数数组arrayN,并分别把这两个数组中的数据个数显示出来。 〔解答〕

.model small include io.inc .stack .data

arrayM db 1,2,3,4,5,6,0,-3,-5,-6,0,7,6,90,-18,-23,34,7,9,8 ;源数组 arrayP db 20 dup(?) ;正数数组 arrayN db 20 dup(?) ;负数数组 dispP db 'Plus Number: ','$'

dispN db 0dh,0ah,'Negs Number: ','$' .code .startup

mov cx, 20 ;源数组元素数

xor bx, bx ;设bh为正数个数,bl为负数个数,均清零 xor si, si ;源数组地址位移量 again: ;循环20次 mov ax, arrayM[si] ;取一个元素 cmp ax,0 ;判正数

jl Neg

inc bh ;是,正数个数加1 jmp next

Neg: inc bl ;否,负数个数加1 next: inc si ;修改位移量 loop again ;循环次数减1

mov ah,09h ;调用显示字符串功能 mov dx, offset dispP ;显示个数 int 21h mov al,bh

call dispuib ; 调用I/O子程序库中的子程序 mov ah,09h ;调用显示字符串功能 mov dx, offset dispN ;显示个数 int 21h mov al,bl

call dispuib ; 调用I/O子程序库中的子程序 .exit 0

end

〔习题4.19〕编写计算100个正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示?overflow?。 〔解答〕

.model small .stack .data num equ 100 wlist dw num dup(?) wordsum dw ? error db 'overflow. $' .code .startup

mov bx,offset wlist mov cx,num xor ax,ax again: add ax,[bx] jc next inc bx inc bx loop again mov [bx],ax jmp done

next: mov dx,offset error mov ah,9 int 21h done: .exit 0 end

4-28写一个子程序,根据入口参数AL=0/1/2,分别实现对大写字母转换成小写、小写转换成大写或大小写字母互换。欲转换的字符串在string中,用0表示结束。〔解答〕

Change proc

Push bx ;保护bx xor bx, bx ;位移量清零

cmp al,0 ;根据入口参数AL=0/1/2,分别处理 jz chan_0 dec al jz chan_1 dec al jz chan_2 jmp done

chan_0: mov al,string[bx] ;实现对大写字母转换成小写 cmp al,0 jz done

cmp al,?A? ;是大写字母 jb next0

cmp al,?Z? ;是大写字母 ja next0

add al, 20h ;转换 mov string[bx], al

next0: inc bx ;位移量加1,指向下一字母 jmp chan_0

chan_1: mov al,string[bx] ;实现对小写字母转换成大写 cmp al,0 jz done

cmp al,?a? ;是大写字母 jb next1

cmp al,?z? ;是大写字母 ja next1

sub al, 20h ;转换 mov string[bx], al

next0: inc bx ;位移量加1,指向下一字母

jmp chan_1

chan_2: mov al,string[bx] ;实现对大写字母转换成小写 cmp al,0 jz done

cmp al,?A? ;是大写字母 jb next2

cmp al,?Z? ;是大写字母 ja next20

add al, 20h ;转换 jmp next2

next20: cmp al,?a? ;是大写字母 jb next2

cmp al,?z? ;是大写字母 ja next2

sub al, 20h ;转换 mov string[bx], al

next2: inc bx ;位移量加1,指向下一字母 jmp chan_2

done: pop bx ;恢复bx ret change endp

本文来源:https://www.bwwdw.com/article/1yh7.html

Top