汇编语言复习知识点(郑晓薇版)

更新时间:2023-09-29 03:11:01 阅读量: 综合文库 文档下载

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

1.9 写出下列算式的二进制运算结果,标志位CF、SF、ZF、OF分别是什么值?

(1)56+63 (2)83-45 (3)-74+29 (4)-92-37 答案:

(1) 56+63=01110111B,CF=0,SF=0,ZF=0,OF=0

(2) 83-45=00100110B,CF=0,SF=0,ZF=0,OF=0

(3) -74+29=11010011B,CF=0,SF=1,ZF=0,OF=0

(4) -92-37=01111111B,CF=1,SF=0,ZF=0,OF=1

2.13 有一个32K字节的存储区,首地址是3302:5AC8H,写出其首单元和末单元的物理地址。 答案:

首单元的物理地址=38AE8H,末单元的物理地址=38AE8H+7FFFH=40AE7H

2.15 存储单元地址和内容表示如下,请画出存储单元存放形式。

(1) (1280A)=3456H (2) (20021H)=4DH (3) (33450H)=37A520D1H

2.16 根据逻辑地址计算出物理地址,并解释逻辑地址与物理地址的对应关系。

(1) 2389:3DE9H (2) 1230:EC92H (3) 14D9:C202H 答案:

(1)物理地址=27679H (2) 物理地址=20F92H (3) 物理地址=20F92H

(2)和(3)的物理地址是一样的。说明逻辑地址不唯一,多个逻辑地址可对应到同一个物理单元上。

2.17 给出段地址和偏移地址如下,计算出对应的物理地址。

(CS)=54C3H,(ES)=2569H,(DS)=1200H,(SS)=4422H,

(BX)=5678H,(SP)=9945H,(IP)=0E54H,(DI)=63B1H 答案:

代码段CS:IP的物理地址=55A84H 堆栈段SS:SP的物理地址=4DB65H

数据段DS:BX的物理地址=17678H 附加段ES:DI的物理地址=2BA41H

3.2 分别写出与数据有关的7种寻址方式并举例说明。

3.3 已知(BX)=1290H,(SI)=348AH,(DI)=2976H,(BP)=6756H,(DS)=2E92H,(ES)=4D82H,(SS)=2030H,请指出下列指令的寻址方式,并求出有效地址EA和物理地址: MOV AX,BX MOV AX,1290H MOV AX,[BX] MOV AX,DS:[1290H] MOV AX,[BP] MOV [DI][BX],AX MOV ES:[SI],AX 查看正确答案

MOV AX,BX 源操作数为寄存器寻址,EA 无,物理地址 无

MOV AX,1290H 立即寻址,EA 无,物理地址 无 MOV AX,[BX] 寄存器间接寻址,EA=1290H, 物理地址=2FBB0H

MOV AX,DS:[1290H] 直接寻址,EA=1290H, 物理地址=2FBB0H

MOV AX,[BP] 寄存器间接寻址,EA=6756H, 物理地址=26A56H

MOV [DI][BX],AX 目的操作数为基址变址寻址,

EA=3C06H, 物理地址=32526H

MOV ES:[SI],AX 寄存器间接寻址,EA=348AH, 物理地址=50CAAH

3.7 请指出下列指令的错误: MOV AX,[CX] MOV AL,1200H MOV AL,BX MOV [SI][DI],AX MOV ES:[DX],CX MOV [AX],VALUE MOV COUNT,[SI] 答案:

MOV AX,[CX] 错。CX不能为间址寄存器 MOV AL,1200H 错。立即数超出8位寄存器范围 MOV AL,BX 错。两个操作数不匹配

MOV [SI][DI],AX 错。两个变址寄存器不能在一起 MOV ES:[DX],CX 错。DX不能为间址寄存器 MOV [AX],VALUE 错。AX不能为间址寄存器 MOV COUNT,[SI] 错。两个操作数不能都是存储单元 3.9 写出用下列寻址方式将存储单元X中的第3个字取出,AX与其相加再放入Y单元的指令序列。

(1)直接寻址 (2)寄存器相对寻址 (3)基址变址 答案

(1) ADD AX,[X+4] MOV Y,AX (2) MOV BX,4 ADD AX,X[BX] MOV Y,AX (3) MOV BX,4 MOV SI,OFFSET X ADD AX,[BX+SI] MOV Y,AX

4.9 解释下列伪指令的作用:

(1) ASSUME CS:CODE,DS:DATA (2) END START (3) VALUE DW 12,35,-6 (4) STRING DB ‘INPUT:’ (5) MESS DB 5 DUP(?) (6) XX DD 12345678H (7) ORG 0320H (8) CONT EQU 2*3.14 4.10 根据题目,写出相关伪指令:

(1) 定义数据段DATA,并在数据段中定义两个字单元X、Y,初始值都是0

(2) 定义一个字符串SRING,保存’Computer’

(3) 定义有100个字节单元的COUNT数组,初始值均为空

(4) 用赋值伪指令定义PI为3.14

(5) 用类型操作符LABEL将VALUE单元定义为字节型 查看正确答案

(1) DATA SEGMENT X DW 0 Y DW 0 DATA ENDS

(2) STRING DB ’Computer’ (3) COUNT DB 100 DUP(?) (4) PI EQU 3.14

(5) VALUE LABEL BYTE

4.11 下列伪指令有错吗?如果有错,请指出错误原因: (1) X1 DB 35H,0,-80 (2) X2 DB 35,260,-1 (3) X3 DB 1234H

(4) X4 DW 100 (5) X5 DW 100(?) (6) X6 DD ‘AB’

查看正确答案

(1)对。(2)错。260超出了字节范围。(3)错。X3是字节型,1234H是字型,不匹配。 (4)对。(5)错。缺少DUP。(6)对。 4.12 写出下列指令的执行结果: TABLE DB 3,33,33 H (1) MOV AL,TABLE

(2) MOV AX,WORD PTR TABLE (3) MOV DX,OFFSET TABLE (4) MOV CL,TABLE+2 (5) MOV BX,SEG TABLE (6) MOV BX,TYPE TABLE (7) LEA DX,TABLE 查看正确答案

(1)AL=3。(2)AX=2103H。(3)DX=TABLE的偏移地址。(4)CL=33H

(5)BX=TABLE的段地址。(6)BX=1。(7)DX= TABLE的偏移地址。

4.24 编程序。将键盘输入的小写字母变为大写字母显示在屏幕上。 查看正确答案 .model small .code start:

mov ah,1 ;键盘输入 int 21h

sub al,20h ;变为大写 mov dl,al mov ah,2 int 21h mov ah,4ch int 21h end start

4.26 编写程序,建立一个0~9的平方根表,查表可得某数的平方根。 data segment

x db '0.000','1.000','1.414','1.732','2.000' db

'2.236','2.449','2.646','2.828','3.000' ;建立字符表

y db 5 dup(?) ;存放查到平方根 u db 3 ;要查的数 data ends code segment

assume cs:code,ds:data start:

mov ax,data mov ds,ax mov al,u ;要查的数 mov cl,5 mul cl ;u*5=15(号单元开始)

mov ch,0 mov bx,ax ;地址保存到bx mov si,0 let1:

mov al,x[bx] ;取出平方根数字 mov y[si],al ;存入y inc si inc bx loop let1 ;循环取出5次 mov ah,4ch int 21h code ends end start

4.27 编写查表程序。建立一个班级姓名表,给出学号,可显示出其姓名。

.model small .data

x1 db 'zhang yan $' ;姓名为10个字符宽度

x2 db 'li li $' x3 db 'wang lan $' x4 db 'zhao xue $' x5 db 'li jiang $' u db 3 ;要查的学号 .code start:

mov ax,@data mov ds,ax mov al,u ;给出学号 mov cl,10 mul cl ;u*10=30(号单元开始) mov ah,0 mov dx,ax ;地址保存到dx mov ah,9 ;9号功能显示字符串 int 21h mov ah,4ch

int 21h end start

无符号数比较转移指令包括4种指令: JB 低于则转移 (A<B) 测试条件:CF =1且ZF=0 JBE 低于等于则转移 (A≤B) 测试条件:CF=1或ZF=1 JA 高于则转移 (A>B) 测试条件:CF=0且ZF=0 JAE 高于等于则转移 (A≥B) 测试条件:CF=0或ZF=1

带符号数的最高位为符号位,因此带符号数的数值与无符号数不一样 JL 小于则转移 (A<B) 测试条件:SF≠OF且ZF=0 JLE 小于等于则转移 (A≤B) 测试条件: SF≠OF或ZF=1 JG 大于则转移 (A>B) 测试条件:SF=OF且ZF=0 JGE 大于等于则转移 (A≥B) 测试条件:SF=OF或ZF=1

SAL算术左移指令 SAR算术右移指令 SHL逻辑左移指令 SHR逻辑右移指令 ROL循环左移指令 ROR循环右移指令

RCL带进位的循环左移指令 RCR带进位的循环右移指令

5.14 指出下列指令的错误所在。 (1) AND [SI],3 (2) SUB DS,AX (3) PUSH 5 (4) OR 80H,AL (5) CMP [BX],TABLE (6) ROL AL,3 查看正确答案

(1) 目的操作数是存储单元时,要用PTR伪操作指出单元的属性 (2)DS段寄存器使用非法 (3)立即数使用非法 (4) 目的操作数不允许是立即数 (5) 两个操作数不允许都是存储单元 (6)移位次数超过1要用CL表示。 5.17 简述操作系统对可执行程序的加载和执行过程。

【程序的加载】操作系统进行了如下操作: (1)将用户程序调入内存

(2)建立256字节的程序段前缀PSP区 (3)用DS和ES寄存器保存PSP区的段地址 (4)在PSP后面定义代码段,将程序代码紧接着PSP存放 (5)程序代码所在的段地址放入CS寄存器,偏移地址0000H放入IP寄存器 (6)如果用户程序定义了数据段,则在PSP和代码段之间预留部分空间 (7)设置堆栈区的段地址SS寄存器和堆栈指针 (8)将控制权交给用户程序,开始执行。 5.27 分支程序设计。完成如下公式的计算,请写出程序。

(X+3)/2 X>0 Y= 0 X=0 X×4 X<0 查看正确答案

分支程序设计。完成如下公式的计算,请写出程序。 (X+3)/2 X>0 Y= 0 X=0 X×4 X<0 程序如下: DATA SEGMENT X DB 23 Y DB ? DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,X CMP AL,0 JE SUB2 JG SUB1 MOV CL,2 SAL AL,CL JMP SHORT SUB2 SUB1:ADD AL,3 SAR AL,1

SUB2: MOV Y,AL MOV AH,4CH INT 21H CODE ENDS END START

5.29 字数组M中有10个数据,分类统计其中正数、负

数、0的个数,分别存入POSI、NEGA、ZERO 单元。【可能会把题目改成求奇数、偶数的数目】

查看正确答案

字数组M中有10个数据,分类统计其中正数、负数、0的个数,分别存入POSI、NEGA、ZERO 单元。 程序如下: DATA1 SEGMENT

M DW 21,-34,32,112,-324,0,76,0,48,50 POSI DW ? NEGA DW ? ZERO DW ? DATA1 ENDS CODE1 SEGMENT

ASSUME CS: CODE1,DS:DATA1 START: MOV AX,DATA1 MOV DS,AX MOV CX,10 LEA SI,M

AGAIN: CMP WORD PTR [SI],0 JL LOWER JE EQUAL INC POSI JMP LPP1

LOWER: INC NEGA JMP LPP1

EQUAL: INC ZERO LPP1: ADD SI,2 DEC CX JNZ AGAIN MOV AH,4CH INT 21H CODE1 ENDS END START

6.14 源串STRG1和目的串STRG2分别放在数据段和附加段中,请写出含有各种段定义的程序段,完成将STRG1传送到STRG2的功能。

DATAS SEGMENT

STRG1 DB 'NEUQ COMPUTER SCIENCE AND TECHNOLOGY' STRG DB ? DATAS ENDS

EXTRAS SEGMENT STRG2 DB 30 DUP(?) EXTRAS ENDS

STACKS SEGMENT

;此处输入堆栈段代码 STACKS ENDS

CODES SEGMENT ASSUME

CS:CODES,DS:DATAS,SS:STACKS,ES:EXTRAS START:

MOV AX,DATAS MOV DS,AX

MOV AX,EXTRAS MOV ES,AX LEA SI,STRG1 LEA DI,STRG2

MOV CX,STRG-STRG1 CLD

REP MOVSB MOV AH,4CH INT 21H CODES ENDS END START

6.17写程序段。在长度为N的字数组VALUE中统计负数

的个数并保存到AX中。 查看正确答案

写程序段。在长度为N的字数组VALUE中统计负数的个数并保存到AX中。

DATAS SEGMENT

value db 1,-2,3,5,-8,-3,-2,-7 N db ? DATAS ENDS

STACKS SEGMENT

;此处输入堆栈段代码 STACKS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS START:

MOV AX,DATAS MOV DS,AX mov cx,N-value lea bx,value mov ax,0 s:

cmp byte ptr [bx],0 jns t inc ax t: inc bx

loop s

MOV AH,4CH INT 21H CODES ENDS END START

6.20 编程。在FOUND字数组中找出最小数存入MIN单元。

DATAS SEGMENT

FOUND db 1,3,5,7,9,-1,-3,-5,0,9 MIN db ? DATAS ENDS

STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS START:

MOV AX,DATAS MOV DS,AX lea bx,FOUND mov cx,min-found let0:

cmp MOV AH,4CH INT 21H CODES ENDS END START

【冒泡算法】的主要思想是从第一个元素开始,依次对两个相邻的元素进行比较,如果第一个元素比第二个大,则两数交换位置,第一遍N-1次比较之后,最大的数排在最后;再做第二遍N-2次比较,比较出第二大的数……;以此类推,最多进行N-1遍比较,所有的数按从小到大升序排序。 将字数组PART按升序排序。 设计思路:

(1)用两条LOOP指令实现双重循环时,对CX寄存器有冲突。采用PUSH CX指令将外循环的CX值入栈保存,内循环的LOOP结束后,再将外循环的CX恢复; (2)用相对寄存器寻址取出两数进行比较。 程序如下:

;6-5.asm 将字数组part按升序排序。 data segment

part dw 15,32,6,-27,8 sign dw ? data ends

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

Top