1 / 45

北京理工大学现代远程教育

北京理工大学现代远程教育. 《 》 第二次串讲. 汇编语言程序设计. 北京理工大学计算机系 张雪兰教授 Tel : 010-68912420 E_mail : xlzh @learn.bit.edu.cn. 第二章部分习题与答案. 3 .以下为用段基址 : 偏移量形式表示的内存地址,试计算它们的物理地址。 ⑴ 12F8:0100 ⑵ 1A2F:0103 ⑶ 1A3F:0003 ⑷ 1A3F:A1FF 答案: ⑴ 13080H ⑵ 1A3F3H ⑶ 1A3F3H ⑷ 245EFH.

siran
Download Presentation

北京理工大学现代远程教育

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 北京理工大学现代远程教育 《 》第二次串讲 汇编语言程序设计 北京理工大学计算机系 张雪兰教授 Tel : 010-68912420 E_mail : xlzh@learn.bit.edu.cn

  2. 第二章部分习题与答案 3.以下为用段基址:偏移量形式表示的内存地址,试计算它们的物理地址。 ⑴ 12F8:0100 ⑵ 1A2F:0103 ⑶ 1A3F:0003 ⑷ 1A3F:A1FF 答案: ⑴ 13080H ⑵ 1A3F3H ⑶ 1A3F3H ⑷ 245EFH

  3. 第二章部分习题与答案(续) 4.自12FA:0000开始的内存单元中存放以下数据(用十六进制形式表示):03 06 11 A3 13 01,试分别写出12FA:0002的字节型数据、字型数据及双字型数据的值。 答案:在12FA:0002地址中, 字节型数据:11H 字型数据: 0A311H 双字型数据:0113A311H

  4. 第二章部分习题与答案(续) 9.从右边的说明中为左边的术语选择正确答案,并把答案填入括号中(用字母表示)。 ⑴ CPU ( F) 分析、控制并执行指令的部件,由算术逻辑部件和寄存器组等组成 ⑵ IP ( E) 指示下一条要执行指令地址的偏移量 ⑶ SP ( A) 保存当前栈顶地址的寄存器 ⑷ 堆栈( B) 以后进先出方式工作的存储器空间

  5. 第二章部分习题与答案(续) ⑸ 存储器( D)存储程序、数据等信息的记忆装置 ⑹ 汇编语言( H) 用指令的助记符、符号地址、标号等符号书写程序的语言 ⑺ 机器语言( G)能被计算机直接识别的语言 ⑻ 段寄存器( J )保存正在运行程序的当前段起始地址的寄存器 ⑼ 连接程序(K) 把若干个模块连接起来成为可执行文件的系统程序

  6. 第二章部分习题与答案(续) ⑽ 汇编程序(C) 把汇编语言源程序翻译成机器语言的系统程序 ⑾ 运算结果标志 ( L)记录运算或操作结果的标志 ⑿ 汇编语言源程序( I)用汇编语言书写的程序 答案: F E A B D H G J K C L I

  7. 第三章部分习题与答案 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

  8. 第三章第2题答案 题号 目标操作数寻址方式 源操作数寻址方式 ⑴ 寄存器寻址方式 立即寻址方式 ⑵ 寄存器寻址方式 立即寻址方式 ⑶ 寄存器间接寻址方式 寄存器寻址方式 ⑷ 寄存器寻址方式 寄存器寻址方式 ⑸ 直接寻址方式 立即寻址方式 ⑹ 直接寻址方式 寄存器寻址方式 ⑺ 寄存器相对寻址方式 寄存器寻址方式 ⑻ 寄存器寻址方式 基址变址寻址方式 ⑼ 相对基址变址寻址方式 寄存器寻址方式

  9. 第三章部分习题与答案(续) 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

  10. 第三章第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

  11. 第三章部分习题与答案(续) 6.试述以下指令的区别: ⑴ MOV AX,3000H 与 MOV AX,[3000H] 答案: ⑴ MOV AX,3000H指令源操作数的寻址方式为立即寻址方式,指令执行结果为:(AX)=3000H。 而MOV AX,[3000H]指令源操作数的寻址方式为直接寻址方式,指令执行结果为: (DS:3000H)→AX。

  12. 第三章部分习题与答案(续) ⑵ MOV AX,MEM 与 MOV AX,OFFSET MEM 答案: ⑵ MOV AX,MEM指令源操作数的寻址方式为直接寻址方式,指令执行结果为: (DS:MEM)→AX。 而MOV AX,OFFSET MEM指令的执行结果是把MEM的偏移量送AX。

  13. 第三章部分习题与答案(续) ⑶ MOV AX,MEM 与 LEA AX,MEM 答案: ⑶ MOV AX,MEM指令的执行结果是 (DS:MEM)→AX。 而LEA AX,MEM的执行结果是把MEM的偏移量送AX。

  14. 第三章部分习题与答案(续) 9.指出下列指令的错误: ⑴ MOV [AX],BX 答案:寄存器间接寻址方式不能用AX寄存器 ⑵ MOV AL,1280 答案:源操作数超出目标范围 ⑶ MOV [BX],9 答案:目标操作数类型未知 ⑷ MOV DS,1000H 答案:立即数不能直接送段寄存器 ⑸ MOV VAR,[BX] 答案:两个操作数不能同时为存储器操作数

  15. 第三章部分习题与答案(续) ⑹ MOV M1,M2 答案:两个操作数不能同时为存储器操作数 ⑺ MOV 6,CX 答案:操作数不能是立即数 ⑻ MOV AX,[SI][DI] 答案:源操作数寻址方式错 ⑼ MOV CS,AX 答案:目标操作数不能是代码段寄存器 ⑽ MOV BX,OFFSET VAR[SI] 答案:OFFSET后只能跟变量或标号名

  16. 第三章部分习题与答案(续) 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. 第三章部分习题与答案(续) 17.编程序使: ⑴ 使AL的各位变反。 ⑵ BX寄存器低四位置1。 ⑶ AX寄存器的低四位清0。 ⑷ 使CX寄存器的低四位变反。 ⑸ 用TEST指令测试AL寄存器的位0和位6是否同时为0,若是则把0送DH寄存器,否则把1送DH寄存器。

  18. 第三章第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: …

  19. 第三章部分习题与答案(续) 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

  20. 第三章部分习题与答案(续) 19.使用指令REP MOVSB指令时,请问: ⑴ 指令完成什么功能? ⑵ 要求哪些初始条件? 答案: ⑴ 指令完成传送字符串功能。 ⑵ 要求设置以下初始条件:CX、DF、SI、DI、DS、ES

  21. 第三章部分习题与答案(续) 20.在执行字符串指令时,何时需要DF标志置1?何时需要清0? 答案: 地址指针减量时使DF=1,增量时使DF=0。

  22. 第三章部分习题与答案(续) 25.假定AX和BX中是有符号数据,CX和DX中是无符号数据,请为下列各项确定CMP和条件转移指令: ⑴ CX值超过DX转移。 答案: ⑴ CMP CX,DX JA L1 ;也可以用JNBE L1指令 … L1: …

  23. 第三章第25题与答案(续) ⑵ AX值未超过BX转移。 答案: ⑵ CMP AX,BX JNG L1 ;也可以用JLE L1指令 … L1: …

  24. 第三章第25题与答案(续) ⑶ DX值为0转移。 答案: ⑶ CMP DX,0 JZ L1 … L1: …

  25. 第三章第25题与答案(续) ⑷ CX值等于小于DX转移。 答案: ⑷ CMP CX,DX JBE L1 ;也可以用JNA L1指令 … L1: …

  26. 第三章部分习题与答案(续) 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位。

  27. 第四章部分习题答案 2.一个.EXE文件至少应该包括代码段。 3.一个.EXE文件的主过程必须是FAR型。 4.可执行程序的END后必须是主过程名。 10.各语句为变量分配的字节数为: ⑴ 1 ⑵ 1 ⑶ 3 ⑷ 82 ⑸ 6 ⑹ 8 ⑺ 4 ⑻ 2 ⑼ 2

  28. 第四章部分习题答案(续) 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。

  29. 第四章部分习题答案(续) 12.⑴ N1=15 ⑵ AL=123 ⑶ 错,两个操作数不能同时为存储器操作数。 ⑷ AL=33H ⑸ DX=7 ⑹ N5=000EH ⑺ 错,类型不匹配。 ⑻ 错,类型不匹配。⑼ 错,NUM1是一个常数。 ⑽ 错,由EQU定义的符号在同一个程序中不能再定义。 18.L1的值为6,L2的值为3。

  30. 内存低端 11H 22H 33H 44H 55H 66H ③ ② ① FIRST 112233H +445566H ③②① SECOND SUM 图3–17 三字节长 加法程序示意图 例. 试编写两个三字节长的二进制数加法程序,加数FIRST、SECOND及和SUM的分配情况如图所示。

  31. 分析:题目较简单,算法类似于手工计算,从最低字节数据开始加起,计算高字节时要考虑低字节的进位问题。为了简化讨论,假设和不会超过三字节,即最高位不会有进位产生。为了最大限度地用到我们所学的指令和寻址方式,本程序不使用循环结构,不考虑优化问题。因为是三字节数据,所以不能用字或双字加法指令实现。分析:题目较简单,算法类似于手工计算,从最低字节数据开始加起,计算高字节时要考虑低字节的进位问题。为了简化讨论,假设和不会超过三字节,即最高位不会有进位产生。为了最大限度地用到我们所学的指令和寻址方式,本程序不使用循环结构,不考虑优化问题。因为是三字节数据,所以不能用字或双字加法指令实现。

  32. 编程如下: 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 ;修改加数指针,使指向中字节

  33. 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单元)

  34. 讨论: ①两个ADC指令能否换为ADD?答案是否定的。因为在对高字节计算时要考虑到低字节的进位,这个进位在执行上一条加法指令时已反映在CF中。

  35. ② DEC DI和SUB DI,1指令的功能从表面上看是等价的,是否可以互换?在本程序中答案是否定的。因为上一条加法指令对CF的影响后边要用到,所以不能破坏CF值,使用DEC指令正好不影响CF。但是可以用以下指令序列代替本程序中的DEC DI,以保证得到正确的CF值。 PUSHF ;保存包括CF的FLAGS值 SUB DI,1 ;修改DI POPF ;恢复原FLAGS值

  36. 多字节或多字加减时,CF始终有意义(前边的反映进/借位,最后一次反映溢出情况),而OF只有最后一次的才有意义。 ④ 溢出情况判断:若是两个无符号数相加,则当最后一次的CF被置1时,表示溢出,结果不正确;若是两个带符号数相加,则当最后一次的OF被置1时,表示溢出,结果不正确。 从该例可以看出,选取合适的算法、恰当的指令、灵活的寻址方式对汇编语言程序设计人员十分重要,它可以达到事半功倍的效果。

  37. 实验程序举例 类实验2.内存自AREA1单元开始连续存放了20个已排好序的无符号字节型数,编程序将其传送到自AREA2开始的单元中,要求传送后的数据不重复出现。(本例与实验2的区别是传送可显示的字节型数据,以便在屏幕上显示验证)。 源程序见TEST2.ASM 可执行程序见TEST2.EXE

  38. 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

  39. 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

  40. 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

  41. 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

  42. 运行结果 传送前:00111112223344556777899aabcdd 传送后: 0123456789abcd

  43. 习题 第二章习题 全部 第三章习题 2、3、6、9、11、17、25、26 第四章习题 2、3、4、10、11、12、18 其他章主要通过编程掌握

  44. 上 机 实 验 1.在程序中定义以下数据:(第9周) TITLE0 DB ‘ABCDEFGHIJKLMNOPQRST’ PRT1 DB 20 DUP( )请用字符串指令实现以下功能: ⑴ 把TITLE0从左到右传送到PRT1。 ⑵ 把TITLE0从右到左传送到PRT1。 2.内存自AREA1单元开始连续存放了20个已排好序的带符号字型数据,编程序将其传送到自AREA2开始的单元中,要求传送后的数据不重复出现。 (第11周)

  45. 上机实验 3.从键盘输入一串字符,并逆序显示到屏幕上。 (第13周) 4.基于第2题的结果(即AREA2中已是无重复数据的有序数组),若数组中包含数字52,则把它删除,否则把它插入到适当位置(即插入后应保持数组仍然有序)。 (第14周)5.从键盘上输入10个字型无符号数,把其按从小到大的顺序排列,并把最大数用十进制数的形式显示在屏幕上(要求:从键盘输入的功能用宏指令实现,显示功能用子程序实现)。 (第16周)

More Related