460 likes | 677 Views
北京理工大学现代远程教育. 《 》 第二次串讲. 汇编语言程序设计. 北京理工大学计算机系 张雪兰教授 Tel : 010-68912420 E_mail : xlzh @learn.bit.edu.cn. 第二章部分习题与答案. 3 .以下为用段基址 : 偏移量形式表示的内存地址,试计算它们的物理地址。 ⑴ 12F8:0100 ⑵ 1A2F:0103 ⑶ 1A3F:0003 ⑷ 1A3F:A1FF 答案: ⑴ 13080H ⑵ 1A3F3H ⑶ 1A3F3H ⑷ 245EFH.
E N D
北京理工大学现代远程教育 《 》第二次串讲 汇编语言程序设计 北京理工大学计算机系 张雪兰教授 Tel : 010-68912420 E_mail : xlzh@learn.bit.edu.cn
第二章部分习题与答案 3.以下为用段基址:偏移量形式表示的内存地址,试计算它们的物理地址。 ⑴ 12F8:0100 ⑵ 1A2F:0103 ⑶ 1A3F:0003 ⑷ 1A3F:A1FF 答案: ⑴ 13080H ⑵ 1A3F3H ⑶ 1A3F3H ⑷ 245EFH
第二章部分习题与答案(续) 4.自12FA:0000开始的内存单元中存放以下数据(用十六进制形式表示):03 06 11 A3 13 01,试分别写出12FA:0002的字节型数据、字型数据及双字型数据的值。 答案:在12FA:0002地址中, 字节型数据:11H 字型数据: 0A311H 双字型数据:0113A311H
第二章部分习题与答案(续) 9.从右边的说明中为左边的术语选择正确答案,并把答案填入括号中(用字母表示)。 ⑴ CPU ( F) 分析、控制并执行指令的部件,由算术逻辑部件和寄存器组等组成 ⑵ IP ( E) 指示下一条要执行指令地址的偏移量 ⑶ SP ( A) 保存当前栈顶地址的寄存器 ⑷ 堆栈( B) 以后进先出方式工作的存储器空间
第二章部分习题与答案(续) ⑸ 存储器( D)存储程序、数据等信息的记忆装置 ⑹ 汇编语言( H) 用指令的助记符、符号地址、标号等符号书写程序的语言 ⑺ 机器语言( G)能被计算机直接识别的语言 ⑻ 段寄存器( J )保存正在运行程序的当前段起始地址的寄存器 ⑼ 连接程序(K) 把若干个模块连接起来成为可执行文件的系统程序
第二章部分习题与答案(续) ⑽ 汇编程序(C) 把汇编语言源程序翻译成机器语言的系统程序 ⑾ 运算结果标志 ( L)记录运算或操作结果的标志 ⑿ 汇编语言源程序( I)用汇编语言书写的程序 答案: F E A B D H G J K C L I
第三章部分习题与答案 2.分别指出下列指令中源操作数和目的操作数的寻址方式。 ⑴ MOV BX,12 ⑵ MOV AL,128 ⑶ MOV [BX],DX ⑷ MOV DS,AX ⑸ MOV VAR,8 ⑹ MOV [1000H],DX ⑺ MOV 6[BX],CX ⑻ MOV AX,[BX][SI] ⑼ MOV TAB[BP][DI],AL
第三章第2题答案 题号 目标操作数寻址方式 源操作数寻址方式 ⑴ 寄存器寻址方式 立即寻址方式 ⑵ 寄存器寻址方式 立即寻址方式 ⑶ 寄存器间接寻址方式 寄存器寻址方式 ⑷ 寄存器寻址方式 寄存器寻址方式 ⑸ 直接寻址方式 立即寻址方式 ⑹ 直接寻址方式 寄存器寻址方式 ⑺ 寄存器相对寻址方式 寄存器寻址方式 ⑻ 寄存器寻址方式 基址变址寻址方式 ⑼ 相对基址变址寻址方式 寄存器寻址方式
第三章部分习题与答案(续) 3.在8086系统中,设(DS)=1000H,(ES)=2000H,(SS)=1200H,(BX)=0300H,(SI)=0200H,(BP)=0100H,VAR的偏移量为0060H,请指出下列指令的目标操作数的寻址方式,若目标操作数为存储器操作数,请计算它们的物理地址是多少? ⑴ MOV BX,12 ⑵ MOV AL,128 ⑶ MOV [BX],DX ⑷ MOV ES:[SI],AX ⑸ MOV VAR,8 ⑹ MOV [1000H],DX ⑺ MOV 6[BX],CX ⑻ MOV [BX][SI],AX ⑼ MOV 6[BP][SI],AL
第三章第3题答案 题号 目标操作数寻址方式 物理地址 ⑴ 寄存器寻址方式 ——— ⑵ 寄存器寻址方式 ——— ⑶ 寄存器间接寻址方式 DS:[BX]=10300H ⑷ 寄存器间接寻址方式 ES:[SI]=20200H ⑸ 直接寻址方式 DS:VAR=10060H ⑹ 直接寻址方式 DS:1000H=11000H ⑺ 寄存器相对寻址方式 DS:[BX+6]=10306H ⑻ 基址变址寻址方式 DS:[BX+SI]=10500H ⑼ 相对基址变址寻址方式 SS:[BP+SI]=12306H
第三章部分习题与答案(续) 6.试述以下指令的区别: ⑴ MOV AX,3000H 与 MOV AX,[3000H] 答案: ⑴ MOV AX,3000H指令源操作数的寻址方式为立即寻址方式,指令执行结果为:(AX)=3000H。 而MOV AX,[3000H]指令源操作数的寻址方式为直接寻址方式,指令执行结果为: (DS:3000H)→AX。
第三章部分习题与答案(续) ⑵ MOV AX,MEM 与 MOV AX,OFFSET MEM 答案: ⑵ MOV AX,MEM指令源操作数的寻址方式为直接寻址方式,指令执行结果为: (DS:MEM)→AX。 而MOV AX,OFFSET MEM指令的执行结果是把MEM的偏移量送AX。
第三章部分习题与答案(续) ⑶ MOV AX,MEM 与 LEA AX,MEM 答案: ⑶ MOV AX,MEM指令的执行结果是 (DS:MEM)→AX。 而LEA AX,MEM的执行结果是把MEM的偏移量送AX。
第三章部分习题与答案(续) 9.指出下列指令的错误: ⑴ MOV [AX],BX 答案:寄存器间接寻址方式不能用AX寄存器 ⑵ MOV AL,1280 答案:源操作数超出目标范围 ⑶ MOV [BX],9 答案:目标操作数类型未知 ⑷ MOV DS,1000H 答案:立即数不能直接送段寄存器 ⑸ MOV VAR,[BX] 答案:两个操作数不能同时为存储器操作数
第三章部分习题与答案(续) ⑹ MOV M1,M2 答案:两个操作数不能同时为存储器操作数 ⑺ MOV 6,CX 答案:操作数不能是立即数 ⑻ MOV AX,[SI][DI] 答案:源操作数寻址方式错 ⑼ MOV CS,AX 答案:目标操作数不能是代码段寄存器 ⑽ MOV BX,OFFSET VAR[SI] 答案:OFFSET后只能跟变量或标号名
第三章部分习题与答案(续) 11.写出把首址为BUF的字型数组的第4个字送到AX寄存器的指令,要求使用以下几种寻址方式: ⑴ 直接寻址方式 ⑵ 使用BX的寄存器间接寻址方式 ⑶ 使用BX的寄存器相对寻址方式 答案: ⑴ MOV AX,BUF+3*2 ⑵ LEA BX,BUF+3*2 MOV AX,[BX] ⑶ MOV BX,3*2 MOV AX,BUF[BX]
第三章部分习题与答案(续) 17.编程序使: ⑴ 使AL的各位变反。 ⑵ BX寄存器低四位置1。 ⑶ AX寄存器的低四位清0。 ⑷ 使CX寄存器的低四位变反。 ⑸ 用TEST指令测试AL寄存器的位0和位6是否同时为0,若是则把0送DH寄存器,否则把1送DH寄存器。
第三章第17题答案(续) 答案: ⑴ NOT AL ⑵ OR BX,000FH ⑶ AND AX,0FFF0H ⑷ XOR CX,000FH ⑸ TEST AL,0100001B JZ A MOV DH,1 JMP SHORT B A: MOV DH,0 B: …
第三章部分习题与答案(续) 18.设X=X7X6X5X4X3X2X1X0,Y=Y7Y6Y5Y4Y3Y2Y1Y0,Z=Y7Y6Y5X4X3X2X1X0,其中X、Y、Z均为二进制数,试编写已知X和Y求Z的程序。 答案: MOV AL,X AND AL,00011111B MOV BL,Y AND BL,11100000B OR AL,BL MOV Z,AL
第三章部分习题与答案(续) 19.使用指令REP MOVSB指令时,请问: ⑴ 指令完成什么功能? ⑵ 要求哪些初始条件? 答案: ⑴ 指令完成传送字符串功能。 ⑵ 要求设置以下初始条件:CX、DF、SI、DI、DS、ES
第三章部分习题与答案(续) 20.在执行字符串指令时,何时需要DF标志置1?何时需要清0? 答案: 地址指针减量时使DF=1,增量时使DF=0。
第三章部分习题与答案(续) 25.假定AX和BX中是有符号数据,CX和DX中是无符号数据,请为下列各项确定CMP和条件转移指令: ⑴ CX值超过DX转移。 答案: ⑴ CMP CX,DX JA L1 ;也可以用JNBE L1指令 … L1: …
第三章第25题与答案(续) ⑵ AX值未超过BX转移。 答案: ⑵ CMP AX,BX JNG L1 ;也可以用JLE L1指令 … L1: …
第三章第25题与答案(续) ⑶ DX值为0转移。 答案: ⑶ CMP DX,0 JZ L1 … L1: …
第三章第25题与答案(续) ⑷ CX值等于小于DX转移。 答案: ⑷ CMP CX,DX JBE L1 ;也可以用JNA L1指令 … L1: …
第三章部分习题与答案(续) 26.试分析下面的程序段完成什么功能? MOV CL,4 SHL DX,CL MOV BL,AH SHL AX,CL SHR BL,CL OR DL,BL 答案:把DX和AX一对寄存器所形成的32位内容左移四位。其中DX中为高16位,AX中为低16位。
第四章部分习题答案 2.一个.EXE文件至少应该包括代码段。 3.一个.EXE文件的主过程必须是FAR型。 4.可执行程序的END后必须是主过程名。 10.各语句为变量分配的字节数为: ⑴ 1 ⑵ 1 ⑶ 3 ⑷ 82 ⑸ 6 ⑹ 8 ⑺ 4 ⑻ 2 ⑼ 2
第四章部分习题答案(续) 11. 变量 偏移 变量 偏移 变量 偏移 N1 0 N2 1 N3 2 N4 5 N5 87 N6 93 N7 101 N8 105 N9 107 N7变量的内容是14700002(设段基址为1470);N8变量的内容是0005;N9变量的内容是0007。
第四章部分习题答案(续) 12.⑴ N1=15 ⑵ AL=123 ⑶ 错,两个操作数不能同时为存储器操作数。 ⑷ AL=33H ⑸ DX=7 ⑹ N5=000EH ⑺ 错,类型不匹配。 ⑻ 错,类型不匹配。⑼ 错,NUM1是一个常数。 ⑽ 错,由EQU定义的符号在同一个程序中不能再定义。 18.L1的值为6,L2的值为3。
内存低端 11H 22H 33H 44H 55H 66H ③ ② ① FIRST 112233H +445566H ③②① SECOND SUM 图3–17 三字节长 加法程序示意图 例. 试编写两个三字节长的二进制数加法程序,加数FIRST、SECOND及和SUM的分配情况如图所示。
分析:题目较简单,算法类似于手工计算,从最低字节数据开始加起,计算高字节时要考虑低字节的进位问题。为了简化讨论,假设和不会超过三字节,即最高位不会有进位产生。为了最大限度地用到我们所学的指令和寻址方式,本程序不使用循环结构,不考虑优化问题。因为是三字节数据,所以不能用字或双字加法指令实现。分析:题目较简单,算法类似于手工计算,从最低字节数据开始加起,计算高字节时要考虑低字节的进位问题。为了简化讨论,假设和不会超过三字节,即最高位不会有进位产生。为了最大限度地用到我们所学的指令和寻址方式,本程序不使用循环结构,不考虑优化问题。因为是三字节数据,所以不能用字或双字加法指令实现。
编程如下: LEA DI,SUM ;建立和的地址指针DI ADD DI,2 ;DI指向和的低字节 MOV BX,2 MOV AL,FIRST[BX] ;取FIRST的低字节 ADD AL,SECOND+2 ;两个低字节相加, ;和①在AL中,进位反映在CF中 MOV [DI],AL ;把低字节和存到DI指向的单元 DEC DI ;修改和指针,使其指向中字节 DEC BX ;修改加数指针,使指向中字节
MOV AL,FIRST[BX] ;取FIRST的中字节 ADC AL,SECOND+1 ;两个中字节相加且加CF, ;和②在AL中,进位反映在CF中 MOV [DI],AL ;把中字节和存到DI指向的 ;单元(本例为SUM+1单元) DEC DI ;修改和指针,使其指向高字节 DEC BX ;修改加数指针,使其指向高字节 MOV AL,FIRST[BX] ;取FIRST的高字节 ADC AL,SECOND ;两个高字节相加且加CF, ;和③在AL中,进位反映在CF中 MOV [DI],AL ;把高字节和存到DI指向的单元(本例为SUM单元)
讨论: ①两个ADC指令能否换为ADD?答案是否定的。因为在对高字节计算时要考虑到低字节的进位,这个进位在执行上一条加法指令时已反映在CF中。
② DEC DI和SUB DI,1指令的功能从表面上看是等价的,是否可以互换?在本程序中答案是否定的。因为上一条加法指令对CF的影响后边要用到,所以不能破坏CF值,使用DEC指令正好不影响CF。但是可以用以下指令序列代替本程序中的DEC DI,以保证得到正确的CF值。 PUSHF ;保存包括CF的FLAGS值 SUB DI,1 ;修改DI POPF ;恢复原FLAGS值
③ 多字节或多字加减时,CF始终有意义(前边的反映进/借位,最后一次反映溢出情况),而OF只有最后一次的才有意义。 ④ 溢出情况判断:若是两个无符号数相加,则当最后一次的CF被置1时,表示溢出,结果不正确;若是两个带符号数相加,则当最后一次的OF被置1时,表示溢出,结果不正确。 从该例可以看出,选取合适的算法、恰当的指令、灵活的寻址方式对汇编语言程序设计人员十分重要,它可以达到事半功倍的效果。
实验程序举例 类实验2.内存自AREA1单元开始连续存放了20个已排好序的无符号字节型数,编程序将其传送到自AREA2开始的单元中,要求传送后的数据不重复出现。(本例与实验2的区别是传送可显示的字节型数据,以便在屏幕上显示验证)。 源程序见TEST2.ASM 可执行程序见TEST2.EXE
stacksg segment stack 's' dw 32 dup() stacksg ends data segment area1 db ‘00111112223344556777899aabcdd’ ;要传送的字符串 crlf db '$’ cn equ crlf-area1 ;串长 area2 db cn dup(?),'$' ;目标串 data ends
code segment main proc far assume cs:code,ds:data,ss:stacksg mov ax,data mov ds,ax mov es,ax mov cx,cn ;串长 cld lea si,area1 lea di,area2 movsb ;传送第一个字符 dec cx ;循环次数减1
l1: lodsb ;从源串装入一个字符在AL中 cmp al,[di-1] ;与目标串字符比较 jz l2 ;重叠不传 stosb ;不重叠传送 l2: loop l1 ;循环 mov ah,9 ;显示源串 lea dx,area1 int 21h mov ah,2 ;显示回车mov dl,0dh int 21h
mov ah,2 ;显示换行 mov dl,0ah int 21h mov ah,9 ;显示目标串 lea dx,area2 int 21h mov ax,4c00h ;返回OS int 21h main endp code ends end main
运行结果 传送前:00111112223344556777899aabcdd 传送后: 0123456789abcd
习题 第二章习题 全部 第三章习题 2、3、6、9、11、17、25、26 第四章习题 2、3、4、10、11、12、18 其他章主要通过编程掌握
上 机 实 验 1.在程序中定义以下数据:(第9周) TITLE0 DB ‘ABCDEFGHIJKLMNOPQRST’ PRT1 DB 20 DUP( )请用字符串指令实现以下功能: ⑴ 把TITLE0从左到右传送到PRT1。 ⑵ 把TITLE0从右到左传送到PRT1。 2.内存自AREA1单元开始连续存放了20个已排好序的带符号字型数据,编程序将其传送到自AREA2开始的单元中,要求传送后的数据不重复出现。 (第11周)
上机实验 3.从键盘输入一串字符,并逆序显示到屏幕上。 (第13周) 4.基于第2题的结果(即AREA2中已是无重复数据的有序数组),若数组中包含数字52,则把它删除,否则把它插入到适当位置(即插入后应保持数组仍然有序)。 (第14周)5.从键盘上输入10个字型无符号数,把其按从小到大的顺序排列,并把最大数用十进制数的形式显示在屏幕上(要求:从键盘输入的功能用宏指令实现,显示功能用子程序实现)。 (第16周)