汇编2,3答案

更新时间:2023-11-08 09:10:01 阅读量: 教育文库 文档下载

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

第2章 8086的指令系统

〔习题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.3〕已知数字0 ~ 9对应的格雷码依次为:18H、34H、05H、06H、09H、0AH、0CH、11H、12H、14H,它存在于以table为首地址(设为200H)的连续区域中。请为如下程序段的每条指令加上注释,说明每条指令的功能和执行结果。 lea bx,table

mov al,8

xlat 〔解答〕

lea bx,table ;获取table的首地址,BX=200H mov al,8 ;传送欲转换的数字,AL=8 xlat ;转换为格雷码,AL=12H P35

〔习题2.4〕什么是堆栈,它的工作原则是什么,它的基本操作有哪两个,对应哪两种指令? 〔解答〕

堆栈是一种按“先进后出”原则存取数据的存储区域,位于堆栈段中,使用SS段寄存器记录其段地址;它的工作原则是先进后出;堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。

〔习题2.5〕已知SS = 2200H、SP = 00B0H,画图说明执行下面指令序列时,堆栈区和SP的内容如何变化? mov ax,8057h push ax

mov ax,0f79h push ax pop bx pop [bx] 〔解答〕

mov ax,8057h push ax

mov ax,0f79h

push ax

pop bx ;bx=0f79h pop [bx] ;DS:[0f79h]=8057h 第3章 汇编语言程序格式

〔习题3.1〕伪指令语句与硬指令语句的本质区别是什么?伪指令有什么主要作用? 〔解答〕

伪指令语句与硬指令语句的本质区别是能不能产生CPU动作;

伪指令的作用是完成对如存储模式、主存变量、子程序、宏及段定义等很多不产生CPU动作的说明,并在程序执行前由汇编程序完成处理。

〔习题3.2〕什么是标识符,汇编程序中标识符怎样组成?

〔解答〕

为了某种需要,每种程序语言都规定了在程序里如何描述名字,程序语言的名字通常被称为标识符;

汇编语言中的标识符一般最多由31个字母、数字及规定的特殊符号(如-,$,?,@)组成,不能以数字开头。

〔习题3.3〕 什么是保留字,汇编语言的保留字有哪些类型,并举例说明。

〔解答

保留字是在每种语言中规定了有特殊意义和功能的不允许再做其它用处的字符串;汇编语言的保留字主要有硬指令助记、伪指令助记符、运算符、寄存器名以及预定义符号等。汇编语言对大小写不敏感。如定义字节数和字符串的DB就是伪指令助记符。

〔习题3.4〕汇编语句有哪两种,每个语句由哪4个部分组成? 〔解答〕

汇编语句有执行性语句和说明性语句;

执行性语句由标号、硬指令助记符、操作数和注释四部分组成; 说明性语句由名字、伪指令助记符、参数和注释四部分组成

〔习题3.5〕汇编语言程序的开发有哪4个步骤,分别利用什么程序完成、产生什么输出文件。 〔解答〕

⒈ 编辑 文本编辑程序 汇编语言源程序.asm ⒉ 汇编 汇编程序 目标模块文件.obj ⒊ 连接 连接程序 可执行文件.exe或.com ⒋ 调试 调试程序 应用程序

〔习题3.6〕将第2章习题2.36采用简化段定义格式编写成一个完整的源程序。 〔解答〕

;简化段定义格式

.model small ; 定义程序的存储模式(小模式) .stack ; 定义堆栈段(默认1024个字节) .data ; 定义数据段

str1 db 'Input Number:0~9 : ',0dh,0ah,'$' str2 db 'Error!',0dh,0ah,'$'

.cade ; 定义代码段

.startup ; 说明程序的起始点,建立ds,ss的内容。 mov ah,09h ; 显示str1字符串 mov dx,offset str1 int 21h

getkey: mov ah,1 ; 调用DOS功能 int 21h

cmp al,'0'

jb error ; 小于0,出错处理

cmp al,'9'

ja error ; 大于9,出错处理

mov ah,02h ; 调用DOS显示字符功能,显示该数字 mov dl,al

int 21h

.exit 0 ; 终止程序执行,返回DOS

error: mov ah,09h ; 出错,调用DOS 功能显示str2字符串 mov dx,offset str2

int 21h

jmp getkey ; 返回按键 end ; 汇编结束

〔习题3.7〕将第2章习题2.37采用完整段定义格式编写成一个完整的源程序。 〔解答〕 ;xt307.asm

stack segment dw 512 dup(?) stack ends data segment array db 255 db 0

array1 db 255 dup('$') array2 db 0dh,0ah,'$' data ends

code segment 'code'

assume cs:code, ds:data, ss:stack start: mov ax,data

mov ds,ax

mov ah,0ah ; 键盘输入字符串 mov dx,offset array int 21h

mov dx,offset array2 ; 回车换行 mov ah,09h int 21h

mov bx,offset array1

again: mov al,[bx] cmp al,'$' jz done

cmp al,'a' ; 小于a和大于z的字符不是小写字母 jb next

cmp al,'z' ja next

sub al,20h ; 在a和z之间的字符才是小写字母,转换为大写 mov [bx],al ; 保存到原位置 next: inc bx

jmp again

done: mov dx,offset array1 mov ah,09h int 21h mov ax,4c00h int 21h code ends

end start

〔习题3.8〕区分下列概念: (1)变量和标号

(2)数值表达式和地址表达式 (3)符号常量和字符串常量 〔解答〕

(1)变量是在程序运行过程中,其值可以被改变的量;标号是由用户自定义的标识符,指向存储单元,表示其存储内容的逻辑地址。

(2)数值表达式一般是由运算符连接的各种常数所构成的表达式,地址表达式是由名字、标号以及利用各种的操作符形成的表达式。

(3)在程序中,为了使常量更便于使用和阅读,经常将一些常量用常量定义语句定义为符号常量,被一对双引号括起来的若干个字符组成的字符序列被称为字符串常量。

〔习题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.10〕OPR1是一个常量,问下列语句中两个AND操作有什么区别? AND AL,OPR1 AND 0feh 〔解答〕

前者为“与”操作硬指令助记符,可汇编成机器代码。

后者为逻辑运算符,在汇编时进行“与”运算,产生具体数值。

〔习题3.11〕给出下列语句中,指令立即数(数值表达式)的值: (1) mov al,23h AND 45h OR 67h (2) mov ax,1234h/16+10h

(3) mov ax,NOT(65535 XOR 1234h) (4) mov al,LOW 1234h OR HIGH 5678h (5) mov ax,23h SHL 4 (6) mov ax,1234h SHR 6

mov cx,num xor ax,ax

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

〔习题3.26〕按下面要求写一个完整段定义格式的源程序

(1)数据段从双字边界开始,其中定义一个100字节的数组,同时该段还作为附加段; (2)堆栈段从节边界开始,组合类型为stack;

(3)代码段的类别是?code?,指定段寄存器对应的逻辑段;主程序指定从100h开始,给有关段寄存器赋初值;将数组元素全部设置为64h。 〔解答〕

stack segment para ?stack? dw 512 dup(?) stack ends data segment

array db 100 dup(?) data ends

code segment ?code?

assume cs:code,ds:data,es:data,ss:stack org 100h

start: mov ax,data mov ds,ax mov es,ax

mov di,offset array mov al,64h mov cx,100 cld

rep stosb mov ax,4c00h int 21h code ends

end start

〔习题3.27〕编制程序完成两个已知双精度数(4字节)A和B相加并将结果存入双精度变量单元SUM中(不考虑溢出)。 〔解答〕 ;xt327.asm .model small

.stack 256 ;定义堆栈段大小为256个字节 .data

A dd 11223344h ;定义两个双字的数(随意) B dd 77553311h

sum dd ? ;定义结果,执行后为:88776655h .code

.startup

xor si, si ;相对于变量的位移量清零 mov cx, 2 ;分高低字分别相加,共两次 clc ;清零cf

again: mov ax, word ptr A[si] ;取第一个数的一个字(先低字后高字) adc ax, word ptr B[si] ;取第二个数的一个字(先低字后高字) mov word ptr sum[si], ax ;存和的一个字(先低字后高字) inc si ;修改位移量指向下一个字(加2) inc si

loop again ;cx=cx-1 ,if cx<>0 ,jump again

.exit 0 end

〔习题3.28〕编制程序完成12H、45H、0F3H、6AH、20H、0FEH、90H、0C8H、57H和34H等10个字节数据之和,并将结果存入字节变量SUM中(不考虑溢出)。 〔解答〕

.startup

xor si, si ;位移量清零 mov al, bdata[si] ;取第一个数 mov cx, num-1 ;累加次数 again: inc si ;指向下一个数 adc al, bdata[si] ;累加

loop again ;如未完,继续累加 mov sum, al ;完了,存结果 .exit 0 end

〔习题3.29〕结构数据类型如何说明、结构变量如何定义、结构字段如何引用? 〔解答〕

结构类型的说明使用一对伪指令STRUCT(MASM5.x是STRUC,功能相同)和ENDS。它们的格式为:

结构名 STRUCT

… ;数据定义语句 结构名 ENDS

结构变量定义的格式为:

变量名,结构名 〈字段初值表〉

引用结构字段,采用圆点“.”操作符,其格式是: 结构变量名.结构字段名。

〔习题3.30〕记录数据类型如何说明,记录变量如何定义,width和mask操作符是什么作用? 〔解答〕

记录类型的说明采用伪指令RECORD,它的格式为: 记录名 RECORD 位段[,位段…] 定义记录变量的格式:

记录变量名 记录名 〈段初值表〉

Width记录名/记录位段名操作符返回记录或记录位段所占用的位数。

mask记录位段名操作符返回一个8位或16位数值,其中对应该位段的个位为1,其余位为0。 评论这张

〔习题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存余数

ja above ;=jnbe above (2)若AX > SI,转到greater执行 cmp ax,si

jg greater ;=jnle greater (3)若CX = 0,转到zero执行 cmp cx,0

jz zero ;= jcxz zero

(4)若AX-SI产生溢出,转到overflow执行; cmp ax,si

jo overflow

(5)若SI≤AX,转到less_eq执行; cmp si,ax ; cmp ax,si jle less_eq ; jge less_eq

(6)若DI≤DX,转到below_eq执行。 cmp di,dx ; cmp dx,di jbe below_eq ; jae below_eq

〔习题2.25〕有一个首地址为array的20个字的数组,说明下列程序段的功能。 mov cx,20 mov ax,0 mov si,ax

sum_loop: add ax,array[si] add si,2

loop sum_loop mov total,ax 〔解答〕

将首地址为array得20个字的数组求和,并将结果存入 total 单元中。

〔习题2.26〕按照下列要求,编写相应的程序段:

(1)起始地址为string的主存单元中存放有一个字符串(长度大于6),把该字符串中的第1个和第6个字符(字节量)传送给DX寄存器。 (2)从主存buffer开始的4个字节中保存了4个非压缩BCD码,现按低(高)地址对低(高)位的原则,将它们合并到DX中。

(3)编写一个程序段,在DX高4位全为0时,使AX = 0;否则使AX = -1。

(4)有两个64位数值,按“小端方式”存放在两个缓冲区buffer1和buffer2中,编写程序段完成buffer1-buffer2功能。

(5)假设从B800h : 0开始存放有100个16位无符号数,编程求它们的和,并把32位的和保存在DX.AX中。

(6)已知字符串string包含有32KB内容,将其中的?$?符号替换成空格。

(7)有一个100个字节元素的数组,其首地址为array,将每个元素减1(不考虑溢出)存于原处。

(8)统计以 ?$? 结尾的字符串srting的字符个数。 〔解答〕 (1)解答:

mov si,0

mov dl,string[si] ;第1个字符送dl寄存器:mov dl,stirng[0] mov si,5

mov dh,string[si] ;第6个字符送dh寄存器:mov dl,stirng[5] (2)解答:

xor si,si ;si清零

mov al,buffer[si] ;第一字节 inc si

mov ah,buffer[si] ;第二字节

mov cl,4

shl ah,cl ;BCD码移到高半字节 or al,ah ;组合成压缩BCD码 mov dl,al ;存入dl寄.. inc si

mov al,buffer[si] ;第三字节 inc si

mov ah,buffer[si] ;第四字节

mov cl,4

shl ah,cl ;BCD码移到高半字节 or al,ah ;组合成压缩BCD码 mov dh,al ;存入dh寄.. (3)解答:

test dx,0f000h ; test dh,0f0h jz next ; jnz next mov ax,-1 ; mov ax,0 jmp again

next: mov ax,0 ; mov ax,0ffffh again: ... (4)解答:

mov ax, word ptr buffer1

sub ax, word ptr buffer2 ;先减低16位

mov dx, word ptr buffer1+2

sbb dx, word ptr buffer2+2 ;后减高16位,需减低16位的借位 (5)解答:

mov ax,0b800h

mov ds,ax ;段地址 xor si,si ;地址偏移量si=0 xor dx,dx ;和的高字dx=0  

本文来源:https://www.bwwdw.com/article/8g32.html

Top