最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

汇编语言程序设计知识点

IT圈 admin 31浏览 0评论

2024年2月22日发(作者:艾耘)

汇编语言程序设计知识点

第一章 基础知识

(1)正负数的补码表示, 掌握计算机中数和字符的表示;

1、假设机器字长为8位,[+3]补 =00000011B,[-3]补= FD

H 。

2、十六进制数0F8H表示的十进制正数为 248 ,表示的十进制负数为 -8 。

3、8位二进制数被看成是带符号补码整数时,其最小值是 -128 ,最大值是 127

4、计算机处理问题中会碰到大量的字符、符号,对此必须采用统一的二进制编码。目前,微机中普遍采用的是

ASCII

码,称为美国信息交换标准码。

第二章80x86计算机组织

(1)中央处理机CPU的组成和80x86寄存器组,重点:专用寄存器,段寄存器

1、IP寄存器中保存的是?下一条指令的首地址

2、FLAGS标志寄存器中共有几位条件状态位?6位

3、有几位控制状态位? 3位

4、标志寄存器分为哪2类?条件码,控制

5、哪个标志位用来控制可屏蔽中断请求是否被CPU响应?IF

6、键盘I/O、显示I/O和打印I/O分别对应16、10和17号中断。

(2)存储单元的地址和内容,存储器地址的分段,实模式下逻辑地址、物理地址的表示。

1、如果SS=6000H,说明堆栈段起始物理地址是60000H。

2、已知字节(00018H)=14H,字节(00017H)=20H,则字(00017H)为

1420H

3、如果数据段中一个内存单元对应的物理地址为3F756H,(DS)=3F00H,那么使用DS段寄存器指明该单元的段基值时,需要使用哪一个偏移量才能正确访问该单元756H。

4.如果(SI)=0088H,(DS)=5570H,对于物理地址为55788H的内存字单元,其内容为0235H,对于物理地址为5578AH的内存字单元,其内容为0E60H,那么执行指令LDS SI,[SI]以后,(SI)= 0235H ,(DS)= 0E60H .

第三章80x86的指令系统和寻址方式

(1)与数据有关的寻址方式(立即寻址方式,寄存器寻址方式,直接寻址方式,寄存器间接寻址方式,寄存器相对寻址方式,基址变址寻址方式,相对基址变址寻址方式)和与转移地址有关的寻址方式(段内直接寻址,段内间接寻址,段间直接寻址,段间间接寻址).

数据传送指令(通用数据传送指令、累加器专用传送指令、输入输出指令)、算术指令(加法指令、减法指令(*加减指令对4个标志位的影响[of,cf,sf,zf])、乘法指令(*乘法指令的要求:目的操作数必须是累加器)、除法指令(*被除数在累加器中,除法指令执行完以后,商和余数在?))、逻辑指令(逻辑运算指令(*XOR,AND,OR,TEST指令及指令执行后对标志位的影响)、移位指令)、串处理指令(与REP相配合工作的MOVS、STOS、LODS指令,与REPE/REPZ和REPNE/REPNZ

1

联合工作的CMPS、SCAS指令)、控制转移指令(无条件转移指令、条件转移指令、循环指令、子程序调用指令、中断)。

1、假定(DS)=2000H,(ES)=2100H,(SS)=1500H,(SI)=00A0H,(BX)=0100H,(BP)=0010H,数据段中变量名VAL的偏移地址为0050H,试指出下列源操作数字段的寻址方式是什么?其物理地址值是多少?

(1) MOV AX, 0ABH

(2) MOV AX, BX

(3) MOV

(4) MOV

(5) MOV

(6) MOV

(7) MOV

(8) MOV

(9) MOV

立即寻址 操作数在指令中

寄存器寻址 操作数为(BX)=0100H

直接寻址 20100H

直接寻址 20050H

寄存器间接寻址 20100H

寄存器间接寻址 21100H

寄存器间接寻址 15010H(BP默认段为SS)

寄存器间接寻址 200A0H

寄存器相对寻址 20110H

寄存器相对寻址 20150H

基址变址寻址 201A0H

AX, [100H]

AX, VAL

AX, [BX]

AX, [BP]

AX, [SI]

AX, ES:[BX]

AX, [BX+10]

(10) MOV AX, VAL[BX]

(11) MOV AX, [BX][SI]

(12) MOV AX, VAL[BX][SI] 相对基址变址寻址 201F0H

2、假定 (DS)= 1000H, (SS)= 2000H,(SI)= 3000H,(BX)= 0100H,(BP)= 0200H,数据段中变量名为OVAR的偏移地址值为0050H,请指出下列源操作数的寻址方式是什么?其物理地址值是多少?

1. MOV DX, [1000H]

2. MOB DX, [BX]

4. MOV DX, [BX+SI]

直接寻址 11000H

寄存器间接寻址 10100H

寄存器相对寻址 10250H

寄存器相对寻址 13100H

3. MOV DX, OVAR[BP]

5. MOV DX, OVAR[BX][SI] 相对基址变址寻址 13150H

(2)数据传送指令(通用数据传送指令、累加器专用传送指令)

算术指令(加法指令、减法指令(*加减指令对4个标志位的影响[of,cf,sf,zf])、乘法指令(*乘法指令的要求:目的操作数必须是累加器)

除法指令(*被除数在累加器中,除法指令执行完以后,商和余数?)

逻辑指令(逻辑运算指令(*XOR,AND,OR,TEST指令及指令执行后对标志位的影响)、移位指令)

串处理指令(与REP相配合工作的MOVS、STOS、LODS指令,与REPE/REPZ和REPNE/REPNZ联合工作的CMPS、SCAS指令)

控制转移指令(无条件转移指令、条件转移指令、循环指令、子程序、中断)

1、将首地址为STRING的字节数组的第7个元素(编号从0开始)送到累加器AL中,用SI寄存器相对寻址的指令为: MOV SI 6H

MOV AL STRING[SI]

2、下列ASCII码串(包括空格符)依次存储在起始地址为CSTRING的字节单元中:

CSTRING DB ‘BASED ADDRESSING’

请编写指令将字符串中的第1个和第7个字符传送给DX寄存器。

2

MOV DH CSRTING

MOV DL CSRTING+7-1

3、如果JMP指令采用段间间接寻址,那么转移地址存放在4个相邻字节单元中,其中前两个字节存放的是 偏移地址 ,而后两个字节存放的是 段地址 。

4、重复前缀指令REP的重复次数由 计数寄存器Count Reg

决定。

5、在串操作指令前使用重复前缀指令REPE,终止串的重复操作条件是 Count Reg=0 或 ZF=0

6、当标志位 CF =1时表示无符号数运算产生溢出,而当标志位 OF

=1是表示带符号数运算产生溢出。

7、AL和VAR字节单元中分别存放一个带符号数,执行CMP AL,VAR时,如果AL>VAR,那么溢出位和符号位的关系是。(OF=SF,还有发生溢出的情况,AL-VAL尽管为负,但OF=1,说明是由于结果太大(负的太大)超出了带符号数的表示范围使得符号位为负的,正确的结果应该为正。)

8、循环控制指令LoopNZ/LoopNE控制循环继续执行的条件是ZF=0且CountReg≠0。

9.设SP=4AH,执行段内返回指令RET 4后,SP的值是 50H 。

10.条件转移指令的转移范围?(只能做段内的短转移)

11.转移指令JMP NEAR PTR PROCA的转移范围是 8000H~7FFFH 。

12.计算机系统通过 主机系统 和外部设备通信。

DOS系统功能调用方式为:(1)设置入口参数;(2)中断程序编号送 AH

寄存器后执行INT 21H。(教材Page320,page335)

13.阅读下面的程序片段,并分析执行结果。

MOV AX,723AH

MOV BX,0C86BH

SUB AL,BL

SBB AH,BH

XOR AL,01H

ADC AX,0

执行该程序片段后:

(AX)= 0A9CEH

,CF =

0

,OF =

0

。(XOR使CF/OF为0)

第四章 汇编语言程序格式

(1)伪操作:数据定义及存储器分配伪操作,表达式赋值伪操作EQU,段定义伪操作、程序开始和结束伪操作、对准伪操作、基数控制伪操作。

(2)汇编语言程序格式:汇编语言源程序中的每个语句的组成格式:名字项、操作项(包括?)、操作数项和注释项

1、在某数据段内定义变量

BUFFER DB 30 DUP (20)

表达式 TYPE BUFFER的值为 1

3

DB 3 DUP(0,2 DUP(1,2),3)

COUNT EQU $-BUFl

变量COUNT的值是 18

SEGMENT

DB 2EH DUP(0)

VAR1 DB 12H,34H

VAR2 DB 10H DUP(O)

ADR1 DW VAR1,VAR2

DATA ENDS

为使ADR1+2字存储单元中内容为0030H,横线上应选用的语句是_ORG$+30H_______。

DW 4,6,$+2,若汇编时BUF分配的偏移地址是0042H,则汇编后BUF数组中第三个字的值是 0048H 。

5、设某数据段:

DATA SEGMENT

ORG 20H

NUM1=8

NUM2=NUM1+10H

DA1 DB ‘COMPUTER’

DB 0AH,0DH

COUNT EQU $-DA1

DA2 DW ‘CO’,’MP’,’UT ,’ER’

DATA ENDS

请回答:(1)DA1的偏移地址是: 20H

(2)COUNT的值是0AH。

(3)DA2+5字节单元的内容是

‘U’的ASCII码。(DW/DB储存字符串的方式不同)

6、执行下列指令序列后,AX寄存器中的内容是什么?

TABLE DW 10,20,30,40,50

ENTRY DW 3

……

MOV BX, OFFSET TABLE

ADD BX, ENTRY

MOV AX, [BX]

1E00H

7. 下面指令执行后,变量DAB中的内容是__0F5H______。

DAW DW 2A05H

DAB DB 0FAH

4

:

MOV AL,BYTE PRT DAW

SUB DAB,AL

第五章 循环与分支程序设计

(1)循环程序结构,分支程序结构

eg. BEG为起始地址的存储区域中存放有100个字节数据,现将其首、尾颠倒过来,重新排放这100个字节数据。请在空行处各填上一条指令完善该程序。

MOV CX,31H

LEA SI,BEG

MOV DI,SI

ADD DI,99

DON:MOV AL,[SI]

XCHG AL,[DI]

MOV [SI],AL

INC SI

DEC DI

LOOP DON

1、阅读如下程序段:

ADRR DB XXH,XXH,……,XXH

NUM EQU $-ADRR

RETT DB ?

MOV CX,NUM

MOV BX,-1

INC BX

;BX值增一

;访问ADRR数组中偏移地址为BX的值并与0比较

;若大于0则继续DON循环

;否则转至NEXT

;CX中存放ADRR数组空间大小

;NUM为ADRR数组空间大小

DON:

CMP ADRR[BX],0

LOOPZ DON

JNZ NEXT

MOV BL,OFFH

MOV RETT,BL

HLT

请回答(1)该程序完成的功能是什么?

在以Adrr为起始地址的数组中查找第一个非0数据

(2)程序执行后RETT字节单元中的内容是什么?

;若循环完未转至NEXT,则BL中为OFFH

;将BL中址送RETT

NEXT:

若找到非0数据,则将第一个非0数据在数组中的偏移量送入RETT单元中,若未找到,则将0FFH送入RETT单元中。

5

2、阅读程序段:

STRING DB ‘ABCDEFGHIJ‘

MOV AH,01

INT 21H

DEC AL

;以上三条语句是将1-9的ASCII码转换为1-9

;BX+AX,即将BX中存放待输出字符的偏移地址

;将STRING中偏移地址为BX的字符取出

AND AL,0FH

XOR AH,AH

ADD BX,AX

MOV AH,02H

INT 21H

请回答:(1)上述程序段的功能是什么?

;这条语句等价于减去30H

MOV BX,OFFSET STRING

MOV BL,[BX]

上述程序段的功能是根据从键盘输入的字符 ‘1’ ~ ‘9’ ,确定在显示器上显示STRING中第几个字符。

(2)从键盘输入字符 ‘4’,程序段有什么结果?

输出’D’

3、阅读程序段:

BLOCK DB 20H,1FH,08H,81H,OFFH…

RESULT DB ?

LEA SI,BLOCK ;使SI指向BLOCK单元首地址

MOV CX,[SI] ;将SI地址中操作数传送到CX寄存器中

INC SI ;SI指向下一个地址

MOV AL,[SI] ;将SI中操作数传送到AL寄存器中

CMP AL,[SI+1] ;比较BLOCK/BLOCK+1地址中操作数

JNG NEXT ;若BLOCK〉BLOCK+1则转至NEXT

MOV AL,[SI+1] ;否则将BLOCK+1中数送入AL寄存器

INC SI ;SI指向下一个地址

;循环执行LOP1

START:

LOP1:

NEXT:

LOOP LOP1

MOV RESULT,AL ;将AL中数送入RESULT中

问:(1)该程序完成的功能是从32个有符号数中找出最小的送入RESULT中。

(2)该程序循环的次数是31次。

4、下列程序片段用来分别统计ARRAY数组中奇数和偶数的个数。请在空白处填写合适的指令。

6

DATA SEGMENT

ARRAY DW 23ABH,1570H,567,1765H,46,5210H

;COUNT为数组中元素个数 COUNT EQU ($-ARRAY)/2

DA1 DB ?

DA2 DB ?

DATA ENDS

……

LEA SI,ARRAY

MOV CX,COUNT

LOP1:

MOV AX,[SI]

;将ARRAY中偏移地址为SI的元素送AX

;最低为为1则为奇数,否则为偶数

;SI中存放ARRAY首地址

;CX中存放数组元素个数

TEST AX,0001H

JZ LOP2

INC BL

JMP LOP3

LOP2:

INC BH

LOP3:

ADD SI,2

;SI地址值增2

DEC CX

JNZ LOP1

MOV DA1,BL

MOV DA2,BH

5.阅读如下程序片段,回答所提出的问题,假定X1,X2,…XN为无符号数。

ORG 100H

BLOK DW X1,X2,…,XN

COUNT EQU($-BLOK)/2

RESULT DW ?

LEA BX,BLOK-2

MOV CX,COUNT

XOR AX,AX

GOON:ADD BX,2

CMP AX,[BX]

JAE NEXT

MOV AX,[BX]

NEXT:LOOP GOON

7

MOV RESULT,AX

程序片段执行完后,RESULT字单元的内容= MAX(X1,X2…Xn) ,

(BX)= 100H+2*(COUNT-1) ,程序循环次数= COUNT 。

6.下列程序片段调用单个字符显示的2号功能显示STRING中的字符串‘COMPUTER’(不显示字符‘$’)。 (调用DOS的2号功能实现)

STRING DB‘COMPUTER’,‘$’

设AX,BX中的数一个为正数,一个为负数,编写程序片段完成将正数送到PLW单元中存放 。

编程实现:

TEST AX,8000H

JE K1或JZ K1

MOV PLW,BW

JMP DONE

K1: MOV PLW,AX

DONE:

7、将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别存放在AL、BL、CL、DL寄存器中。

DATAREA SEGMENT

CODE SEGMENT

TEMP DB 4 DUP(?)

DATAREA ENDS

ASSUME CS:CODE,DS:DATAREA

MOV DS,DATAREA

MOV CL,4

MOV CH,4

LEA BX,TEMP

MOV DX,AX

AND DL,0FH

MOV [BX],DL

INC BX

DEC CH

SHR AX,CL

JNZ ROTATE

;将TEMP地址值送BX

;将AX寄存器值送DX

;将DX寄存器高8位清零

;DX寄存器低8位地址送入BX中

;BX增1

;逻辑作揖

;循环数减1

;若循环未完成则继续循环

8

START:

ROTATE:

MOVE:

MOV DL,TEMP+1

MOV CL,TEMP+2

MOV BL,TEMP+3

MOV AL,TEMP+4

MAIN ENDP

CODE ENDS

END START

8、已定义了两个整数变量A、B,试编写程序完成下列功能:1、若两个数中有一个是奇数,则将奇数存放在A中,偶数存放在B中。2、若两个数均为奇数,则将两数均加1后存回原变量。

DATAREA SEGMENT

A DW ?

B DW ?

DATAREA ENDS

CSEG SEGMENT

MAIN PROC FAR

ASSUME CS:CSEG,DS:DATAREA

START:

PUSH DS

SUB AX,AX

PUSH AX

MOV AX,DATAREA

MOV DS,AX

BEGIN:

MOV AX,A

MOV BX,B

XOR AX,BX ;AX,BX异或

TEST AX,0001H ;测试最低位,0则两数同奇偶

JZ CLASS ;为0则转至CLASS

TEST BX,0001H ;若最低位为0则为偶数,否则为奇数

JZ EXIT ;为0则转至EXIT

XCHG BX,A ;交换BX/A中值,即A中存放奇数

MOV B,BX ;将BX中数送入B中,B中存放偶数

JMP EXIT

CLASS:

TEST BX,0001H ;测试BX是否为奇数

JZ EXIT ;不是则转至EXIT

INC B ;否则B自增1

INC A ;A自增1

EXIT:

9

RET

MAIN ENDP

CSEG ENDS

END START

9、判断寄存器AH和AL中第3位是否相同,如相同,AH置0,否则AH置全1。

答:XOR AH,AL

AND AH,40H

JNZ ONE

JMP NEXT

ONE:MOV AH,0FFH

NEXT:……

10、实现下列算式:W=X+Y+36-Z。设X、Y、Z、W均为双字长数据,各自的低十六位数和高十六位数分别存放在X、X+2、Y、Y+2、Z、Z+2的存储单元中,结果的低十六位字和高十六位字分别存放在W和W+2两个单元中。

答:

DATA SEGMENT

X DD

Y DD

Z DD

W DD

;AH置全1

MOV AH,0

;异或判定是否相同,结果存放在AH中

;将除第三位外的所有位置0

;若不为0,即不相等,转至ONE

;否则AH置0

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

MOV DS,AX

MOV AX,X

ADD AX,Y

MOV BX,X+2

ADC BX,Y+2

ADD AX,36

ADC BX,0

SUB AX,Z

SBB BX,Z+2

MOV W,AX

MOV W+2,BX

END START

START:

CODE ENDS

11、写出执行以下计算的指令序列,其中U、V、W和Z均为存放16位带符号数单元的地址。

10

Z←W-(U+6)-(V+9)

答:MOV AX,U

ADD AX,6

MOV CX,V

ADD CX,9

MOV BX,W

SUB BX,AX

SBB BX,CX

MOV Z,BX

12、试编写一程序段求出双字长数的绝对值。双字长数在A和A+2单元中,结果存放在B和B+2单元中。

答:

MOV AX,A

MOV DX,A+2

CMP DX,0

JNS ZHENGSHU

NEG DX ;求补

NEG AX ;求补

SBB DX,0 ;减1,即求出对应正数

ZHENGSHU:

MOV B,AX

MOV B+2,DX

INT 20H

13. 从键盘输入一个以$为结束符的字符串,统计其中的非数字字符个数。

DSEG SEGMENT

BUFF DB 50 DUP (‘ ’)

MOV COUNT,0

INPUT:MOV AH,01;

INT 21H

MOV [BX],AL

INC BX

CMP AL,’$’;

JNZ INPUT;

LEA BX,BUFF;

NEXT:MOV CL,[BX]

INC BX

CMP CL,’$’;

JZ DISP

CMP CL,30H;

JB NEXT

CMP CL,39H;

JA NEXT

INC COUNT;

11

JMP NEXT

DISP:|;

14. 把0~100之间的30个数存入以GRADE为首地址的30字数组中,GRADE+i表示学号为i+1的学生的成绩。另一个数组RANK为30个学生的名次表,其中RANK+i的内容是学号为i+1的学生的名次。编写一程序,根据GRADE中的学生成绩,将学生名次填入RANK数组中。(一个学生的名次等于成绩高于这个学生的人数加1。)

答:程序如下:

DSEG SEGMENT

GRADE DW 30 DUP(?)

RANK DW 30 DUP(?)

;-----------------------------------------------------

CSEG SEGMENT

MAIN PROC FAR

ASSUME CS : CSEG, DS: DSEG

START: PUSH DS;

SUB AX,AX

PUSH AX

MOV AX,DSEG

MOV DS,AX;

BEGIN: MOV DI,0

MOV CX,30;

LOOP1: PUSH CX

MOV CX,30;

MOV SI,0

MOV AX,GRADE[DI]

MOV DX,1;

LOOP2: CMP GRADE[SI],AX;

JBE GO_ON

INC DX;

GO_ON: ADD SI,2

LOOP LOOP2

POP CX

MOV RNAK[DI],DX;

ADD DI,2

LOOP LOOP1

RET

MAIN ENDP

CSEG ENDS;

;---------------------------------

END START

15. 写出执行以下计算的指令序列,其中X、Y、W和Z均为存放16位带符号数单元的地址。

Z←((W-X)/5*Y)*2

12

答:MOV AX,W

SUB AX,X

CWD

MOV BX,5

IDIV BX

IMUL Y

SHL AX,1; ((DX),(AX))*2

RCL DX,1

16. 试编制一源程序,统计DA1字单元中含0的个数,如统计的个数为奇数,则将进位位置1,否则进位位清0。

DATA SEGMENT

DA1 DW****

DATA ENDS

STACK1 SEGMENT PARA STACK

DB 10H DUP(0)

STACK1 ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:MOV AX,DATA

MOV DS,AX

MOV DH,0

MOV AX,DA1

MOV CX,16

LOOP:SHL AX,1

JC NEXT1

INC DH

NEXT1:LOOP LOP

CLC

TEST DH,1

JZ END0

STC

END0:MOV AH,4CH

INT 21H

CODE END $

END START

13

2024年2月22日发(作者:艾耘)

汇编语言程序设计知识点

第一章 基础知识

(1)正负数的补码表示, 掌握计算机中数和字符的表示;

1、假设机器字长为8位,[+3]补 =00000011B,[-3]补= FD

H 。

2、十六进制数0F8H表示的十进制正数为 248 ,表示的十进制负数为 -8 。

3、8位二进制数被看成是带符号补码整数时,其最小值是 -128 ,最大值是 127

4、计算机处理问题中会碰到大量的字符、符号,对此必须采用统一的二进制编码。目前,微机中普遍采用的是

ASCII

码,称为美国信息交换标准码。

第二章80x86计算机组织

(1)中央处理机CPU的组成和80x86寄存器组,重点:专用寄存器,段寄存器

1、IP寄存器中保存的是?下一条指令的首地址

2、FLAGS标志寄存器中共有几位条件状态位?6位

3、有几位控制状态位? 3位

4、标志寄存器分为哪2类?条件码,控制

5、哪个标志位用来控制可屏蔽中断请求是否被CPU响应?IF

6、键盘I/O、显示I/O和打印I/O分别对应16、10和17号中断。

(2)存储单元的地址和内容,存储器地址的分段,实模式下逻辑地址、物理地址的表示。

1、如果SS=6000H,说明堆栈段起始物理地址是60000H。

2、已知字节(00018H)=14H,字节(00017H)=20H,则字(00017H)为

1420H

3、如果数据段中一个内存单元对应的物理地址为3F756H,(DS)=3F00H,那么使用DS段寄存器指明该单元的段基值时,需要使用哪一个偏移量才能正确访问该单元756H。

4.如果(SI)=0088H,(DS)=5570H,对于物理地址为55788H的内存字单元,其内容为0235H,对于物理地址为5578AH的内存字单元,其内容为0E60H,那么执行指令LDS SI,[SI]以后,(SI)= 0235H ,(DS)= 0E60H .

第三章80x86的指令系统和寻址方式

(1)与数据有关的寻址方式(立即寻址方式,寄存器寻址方式,直接寻址方式,寄存器间接寻址方式,寄存器相对寻址方式,基址变址寻址方式,相对基址变址寻址方式)和与转移地址有关的寻址方式(段内直接寻址,段内间接寻址,段间直接寻址,段间间接寻址).

数据传送指令(通用数据传送指令、累加器专用传送指令、输入输出指令)、算术指令(加法指令、减法指令(*加减指令对4个标志位的影响[of,cf,sf,zf])、乘法指令(*乘法指令的要求:目的操作数必须是累加器)、除法指令(*被除数在累加器中,除法指令执行完以后,商和余数在?))、逻辑指令(逻辑运算指令(*XOR,AND,OR,TEST指令及指令执行后对标志位的影响)、移位指令)、串处理指令(与REP相配合工作的MOVS、STOS、LODS指令,与REPE/REPZ和REPNE/REPNZ

1

联合工作的CMPS、SCAS指令)、控制转移指令(无条件转移指令、条件转移指令、循环指令、子程序调用指令、中断)。

1、假定(DS)=2000H,(ES)=2100H,(SS)=1500H,(SI)=00A0H,(BX)=0100H,(BP)=0010H,数据段中变量名VAL的偏移地址为0050H,试指出下列源操作数字段的寻址方式是什么?其物理地址值是多少?

(1) MOV AX, 0ABH

(2) MOV AX, BX

(3) MOV

(4) MOV

(5) MOV

(6) MOV

(7) MOV

(8) MOV

(9) MOV

立即寻址 操作数在指令中

寄存器寻址 操作数为(BX)=0100H

直接寻址 20100H

直接寻址 20050H

寄存器间接寻址 20100H

寄存器间接寻址 21100H

寄存器间接寻址 15010H(BP默认段为SS)

寄存器间接寻址 200A0H

寄存器相对寻址 20110H

寄存器相对寻址 20150H

基址变址寻址 201A0H

AX, [100H]

AX, VAL

AX, [BX]

AX, [BP]

AX, [SI]

AX, ES:[BX]

AX, [BX+10]

(10) MOV AX, VAL[BX]

(11) MOV AX, [BX][SI]

(12) MOV AX, VAL[BX][SI] 相对基址变址寻址 201F0H

2、假定 (DS)= 1000H, (SS)= 2000H,(SI)= 3000H,(BX)= 0100H,(BP)= 0200H,数据段中变量名为OVAR的偏移地址值为0050H,请指出下列源操作数的寻址方式是什么?其物理地址值是多少?

1. MOV DX, [1000H]

2. MOB DX, [BX]

4. MOV DX, [BX+SI]

直接寻址 11000H

寄存器间接寻址 10100H

寄存器相对寻址 10250H

寄存器相对寻址 13100H

3. MOV DX, OVAR[BP]

5. MOV DX, OVAR[BX][SI] 相对基址变址寻址 13150H

(2)数据传送指令(通用数据传送指令、累加器专用传送指令)

算术指令(加法指令、减法指令(*加减指令对4个标志位的影响[of,cf,sf,zf])、乘法指令(*乘法指令的要求:目的操作数必须是累加器)

除法指令(*被除数在累加器中,除法指令执行完以后,商和余数?)

逻辑指令(逻辑运算指令(*XOR,AND,OR,TEST指令及指令执行后对标志位的影响)、移位指令)

串处理指令(与REP相配合工作的MOVS、STOS、LODS指令,与REPE/REPZ和REPNE/REPNZ联合工作的CMPS、SCAS指令)

控制转移指令(无条件转移指令、条件转移指令、循环指令、子程序、中断)

1、将首地址为STRING的字节数组的第7个元素(编号从0开始)送到累加器AL中,用SI寄存器相对寻址的指令为: MOV SI 6H

MOV AL STRING[SI]

2、下列ASCII码串(包括空格符)依次存储在起始地址为CSTRING的字节单元中:

CSTRING DB ‘BASED ADDRESSING’

请编写指令将字符串中的第1个和第7个字符传送给DX寄存器。

2

MOV DH CSRTING

MOV DL CSRTING+7-1

3、如果JMP指令采用段间间接寻址,那么转移地址存放在4个相邻字节单元中,其中前两个字节存放的是 偏移地址 ,而后两个字节存放的是 段地址 。

4、重复前缀指令REP的重复次数由 计数寄存器Count Reg

决定。

5、在串操作指令前使用重复前缀指令REPE,终止串的重复操作条件是 Count Reg=0 或 ZF=0

6、当标志位 CF =1时表示无符号数运算产生溢出,而当标志位 OF

=1是表示带符号数运算产生溢出。

7、AL和VAR字节单元中分别存放一个带符号数,执行CMP AL,VAR时,如果AL>VAR,那么溢出位和符号位的关系是。(OF=SF,还有发生溢出的情况,AL-VAL尽管为负,但OF=1,说明是由于结果太大(负的太大)超出了带符号数的表示范围使得符号位为负的,正确的结果应该为正。)

8、循环控制指令LoopNZ/LoopNE控制循环继续执行的条件是ZF=0且CountReg≠0。

9.设SP=4AH,执行段内返回指令RET 4后,SP的值是 50H 。

10.条件转移指令的转移范围?(只能做段内的短转移)

11.转移指令JMP NEAR PTR PROCA的转移范围是 8000H~7FFFH 。

12.计算机系统通过 主机系统 和外部设备通信。

DOS系统功能调用方式为:(1)设置入口参数;(2)中断程序编号送 AH

寄存器后执行INT 21H。(教材Page320,page335)

13.阅读下面的程序片段,并分析执行结果。

MOV AX,723AH

MOV BX,0C86BH

SUB AL,BL

SBB AH,BH

XOR AL,01H

ADC AX,0

执行该程序片段后:

(AX)= 0A9CEH

,CF =

0

,OF =

0

。(XOR使CF/OF为0)

第四章 汇编语言程序格式

(1)伪操作:数据定义及存储器分配伪操作,表达式赋值伪操作EQU,段定义伪操作、程序开始和结束伪操作、对准伪操作、基数控制伪操作。

(2)汇编语言程序格式:汇编语言源程序中的每个语句的组成格式:名字项、操作项(包括?)、操作数项和注释项

1、在某数据段内定义变量

BUFFER DB 30 DUP (20)

表达式 TYPE BUFFER的值为 1

3

DB 3 DUP(0,2 DUP(1,2),3)

COUNT EQU $-BUFl

变量COUNT的值是 18

SEGMENT

DB 2EH DUP(0)

VAR1 DB 12H,34H

VAR2 DB 10H DUP(O)

ADR1 DW VAR1,VAR2

DATA ENDS

为使ADR1+2字存储单元中内容为0030H,横线上应选用的语句是_ORG$+30H_______。

DW 4,6,$+2,若汇编时BUF分配的偏移地址是0042H,则汇编后BUF数组中第三个字的值是 0048H 。

5、设某数据段:

DATA SEGMENT

ORG 20H

NUM1=8

NUM2=NUM1+10H

DA1 DB ‘COMPUTER’

DB 0AH,0DH

COUNT EQU $-DA1

DA2 DW ‘CO’,’MP’,’UT ,’ER’

DATA ENDS

请回答:(1)DA1的偏移地址是: 20H

(2)COUNT的值是0AH。

(3)DA2+5字节单元的内容是

‘U’的ASCII码。(DW/DB储存字符串的方式不同)

6、执行下列指令序列后,AX寄存器中的内容是什么?

TABLE DW 10,20,30,40,50

ENTRY DW 3

……

MOV BX, OFFSET TABLE

ADD BX, ENTRY

MOV AX, [BX]

1E00H

7. 下面指令执行后,变量DAB中的内容是__0F5H______。

DAW DW 2A05H

DAB DB 0FAH

4

:

MOV AL,BYTE PRT DAW

SUB DAB,AL

第五章 循环与分支程序设计

(1)循环程序结构,分支程序结构

eg. BEG为起始地址的存储区域中存放有100个字节数据,现将其首、尾颠倒过来,重新排放这100个字节数据。请在空行处各填上一条指令完善该程序。

MOV CX,31H

LEA SI,BEG

MOV DI,SI

ADD DI,99

DON:MOV AL,[SI]

XCHG AL,[DI]

MOV [SI],AL

INC SI

DEC DI

LOOP DON

1、阅读如下程序段:

ADRR DB XXH,XXH,……,XXH

NUM EQU $-ADRR

RETT DB ?

MOV CX,NUM

MOV BX,-1

INC BX

;BX值增一

;访问ADRR数组中偏移地址为BX的值并与0比较

;若大于0则继续DON循环

;否则转至NEXT

;CX中存放ADRR数组空间大小

;NUM为ADRR数组空间大小

DON:

CMP ADRR[BX],0

LOOPZ DON

JNZ NEXT

MOV BL,OFFH

MOV RETT,BL

HLT

请回答(1)该程序完成的功能是什么?

在以Adrr为起始地址的数组中查找第一个非0数据

(2)程序执行后RETT字节单元中的内容是什么?

;若循环完未转至NEXT,则BL中为OFFH

;将BL中址送RETT

NEXT:

若找到非0数据,则将第一个非0数据在数组中的偏移量送入RETT单元中,若未找到,则将0FFH送入RETT单元中。

5

2、阅读程序段:

STRING DB ‘ABCDEFGHIJ‘

MOV AH,01

INT 21H

DEC AL

;以上三条语句是将1-9的ASCII码转换为1-9

;BX+AX,即将BX中存放待输出字符的偏移地址

;将STRING中偏移地址为BX的字符取出

AND AL,0FH

XOR AH,AH

ADD BX,AX

MOV AH,02H

INT 21H

请回答:(1)上述程序段的功能是什么?

;这条语句等价于减去30H

MOV BX,OFFSET STRING

MOV BL,[BX]

上述程序段的功能是根据从键盘输入的字符 ‘1’ ~ ‘9’ ,确定在显示器上显示STRING中第几个字符。

(2)从键盘输入字符 ‘4’,程序段有什么结果?

输出’D’

3、阅读程序段:

BLOCK DB 20H,1FH,08H,81H,OFFH…

RESULT DB ?

LEA SI,BLOCK ;使SI指向BLOCK单元首地址

MOV CX,[SI] ;将SI地址中操作数传送到CX寄存器中

INC SI ;SI指向下一个地址

MOV AL,[SI] ;将SI中操作数传送到AL寄存器中

CMP AL,[SI+1] ;比较BLOCK/BLOCK+1地址中操作数

JNG NEXT ;若BLOCK〉BLOCK+1则转至NEXT

MOV AL,[SI+1] ;否则将BLOCK+1中数送入AL寄存器

INC SI ;SI指向下一个地址

;循环执行LOP1

START:

LOP1:

NEXT:

LOOP LOP1

MOV RESULT,AL ;将AL中数送入RESULT中

问:(1)该程序完成的功能是从32个有符号数中找出最小的送入RESULT中。

(2)该程序循环的次数是31次。

4、下列程序片段用来分别统计ARRAY数组中奇数和偶数的个数。请在空白处填写合适的指令。

6

DATA SEGMENT

ARRAY DW 23ABH,1570H,567,1765H,46,5210H

;COUNT为数组中元素个数 COUNT EQU ($-ARRAY)/2

DA1 DB ?

DA2 DB ?

DATA ENDS

……

LEA SI,ARRAY

MOV CX,COUNT

LOP1:

MOV AX,[SI]

;将ARRAY中偏移地址为SI的元素送AX

;最低为为1则为奇数,否则为偶数

;SI中存放ARRAY首地址

;CX中存放数组元素个数

TEST AX,0001H

JZ LOP2

INC BL

JMP LOP3

LOP2:

INC BH

LOP3:

ADD SI,2

;SI地址值增2

DEC CX

JNZ LOP1

MOV DA1,BL

MOV DA2,BH

5.阅读如下程序片段,回答所提出的问题,假定X1,X2,…XN为无符号数。

ORG 100H

BLOK DW X1,X2,…,XN

COUNT EQU($-BLOK)/2

RESULT DW ?

LEA BX,BLOK-2

MOV CX,COUNT

XOR AX,AX

GOON:ADD BX,2

CMP AX,[BX]

JAE NEXT

MOV AX,[BX]

NEXT:LOOP GOON

7

MOV RESULT,AX

程序片段执行完后,RESULT字单元的内容= MAX(X1,X2…Xn) ,

(BX)= 100H+2*(COUNT-1) ,程序循环次数= COUNT 。

6.下列程序片段调用单个字符显示的2号功能显示STRING中的字符串‘COMPUTER’(不显示字符‘$’)。 (调用DOS的2号功能实现)

STRING DB‘COMPUTER’,‘$’

设AX,BX中的数一个为正数,一个为负数,编写程序片段完成将正数送到PLW单元中存放 。

编程实现:

TEST AX,8000H

JE K1或JZ K1

MOV PLW,BW

JMP DONE

K1: MOV PLW,AX

DONE:

7、将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别存放在AL、BL、CL、DL寄存器中。

DATAREA SEGMENT

CODE SEGMENT

TEMP DB 4 DUP(?)

DATAREA ENDS

ASSUME CS:CODE,DS:DATAREA

MOV DS,DATAREA

MOV CL,4

MOV CH,4

LEA BX,TEMP

MOV DX,AX

AND DL,0FH

MOV [BX],DL

INC BX

DEC CH

SHR AX,CL

JNZ ROTATE

;将TEMP地址值送BX

;将AX寄存器值送DX

;将DX寄存器高8位清零

;DX寄存器低8位地址送入BX中

;BX增1

;逻辑作揖

;循环数减1

;若循环未完成则继续循环

8

START:

ROTATE:

MOVE:

MOV DL,TEMP+1

MOV CL,TEMP+2

MOV BL,TEMP+3

MOV AL,TEMP+4

MAIN ENDP

CODE ENDS

END START

8、已定义了两个整数变量A、B,试编写程序完成下列功能:1、若两个数中有一个是奇数,则将奇数存放在A中,偶数存放在B中。2、若两个数均为奇数,则将两数均加1后存回原变量。

DATAREA SEGMENT

A DW ?

B DW ?

DATAREA ENDS

CSEG SEGMENT

MAIN PROC FAR

ASSUME CS:CSEG,DS:DATAREA

START:

PUSH DS

SUB AX,AX

PUSH AX

MOV AX,DATAREA

MOV DS,AX

BEGIN:

MOV AX,A

MOV BX,B

XOR AX,BX ;AX,BX异或

TEST AX,0001H ;测试最低位,0则两数同奇偶

JZ CLASS ;为0则转至CLASS

TEST BX,0001H ;若最低位为0则为偶数,否则为奇数

JZ EXIT ;为0则转至EXIT

XCHG BX,A ;交换BX/A中值,即A中存放奇数

MOV B,BX ;将BX中数送入B中,B中存放偶数

JMP EXIT

CLASS:

TEST BX,0001H ;测试BX是否为奇数

JZ EXIT ;不是则转至EXIT

INC B ;否则B自增1

INC A ;A自增1

EXIT:

9

RET

MAIN ENDP

CSEG ENDS

END START

9、判断寄存器AH和AL中第3位是否相同,如相同,AH置0,否则AH置全1。

答:XOR AH,AL

AND AH,40H

JNZ ONE

JMP NEXT

ONE:MOV AH,0FFH

NEXT:……

10、实现下列算式:W=X+Y+36-Z。设X、Y、Z、W均为双字长数据,各自的低十六位数和高十六位数分别存放在X、X+2、Y、Y+2、Z、Z+2的存储单元中,结果的低十六位字和高十六位字分别存放在W和W+2两个单元中。

答:

DATA SEGMENT

X DD

Y DD

Z DD

W DD

;AH置全1

MOV AH,0

;异或判定是否相同,结果存放在AH中

;将除第三位外的所有位置0

;若不为0,即不相等,转至ONE

;否则AH置0

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

MOV DS,AX

MOV AX,X

ADD AX,Y

MOV BX,X+2

ADC BX,Y+2

ADD AX,36

ADC BX,0

SUB AX,Z

SBB BX,Z+2

MOV W,AX

MOV W+2,BX

END START

START:

CODE ENDS

11、写出执行以下计算的指令序列,其中U、V、W和Z均为存放16位带符号数单元的地址。

10

Z←W-(U+6)-(V+9)

答:MOV AX,U

ADD AX,6

MOV CX,V

ADD CX,9

MOV BX,W

SUB BX,AX

SBB BX,CX

MOV Z,BX

12、试编写一程序段求出双字长数的绝对值。双字长数在A和A+2单元中,结果存放在B和B+2单元中。

答:

MOV AX,A

MOV DX,A+2

CMP DX,0

JNS ZHENGSHU

NEG DX ;求补

NEG AX ;求补

SBB DX,0 ;减1,即求出对应正数

ZHENGSHU:

MOV B,AX

MOV B+2,DX

INT 20H

13. 从键盘输入一个以$为结束符的字符串,统计其中的非数字字符个数。

DSEG SEGMENT

BUFF DB 50 DUP (‘ ’)

MOV COUNT,0

INPUT:MOV AH,01;

INT 21H

MOV [BX],AL

INC BX

CMP AL,’$’;

JNZ INPUT;

LEA BX,BUFF;

NEXT:MOV CL,[BX]

INC BX

CMP CL,’$’;

JZ DISP

CMP CL,30H;

JB NEXT

CMP CL,39H;

JA NEXT

INC COUNT;

11

JMP NEXT

DISP:|;

14. 把0~100之间的30个数存入以GRADE为首地址的30字数组中,GRADE+i表示学号为i+1的学生的成绩。另一个数组RANK为30个学生的名次表,其中RANK+i的内容是学号为i+1的学生的名次。编写一程序,根据GRADE中的学生成绩,将学生名次填入RANK数组中。(一个学生的名次等于成绩高于这个学生的人数加1。)

答:程序如下:

DSEG SEGMENT

GRADE DW 30 DUP(?)

RANK DW 30 DUP(?)

;-----------------------------------------------------

CSEG SEGMENT

MAIN PROC FAR

ASSUME CS : CSEG, DS: DSEG

START: PUSH DS;

SUB AX,AX

PUSH AX

MOV AX,DSEG

MOV DS,AX;

BEGIN: MOV DI,0

MOV CX,30;

LOOP1: PUSH CX

MOV CX,30;

MOV SI,0

MOV AX,GRADE[DI]

MOV DX,1;

LOOP2: CMP GRADE[SI],AX;

JBE GO_ON

INC DX;

GO_ON: ADD SI,2

LOOP LOOP2

POP CX

MOV RNAK[DI],DX;

ADD DI,2

LOOP LOOP1

RET

MAIN ENDP

CSEG ENDS;

;---------------------------------

END START

15. 写出执行以下计算的指令序列,其中X、Y、W和Z均为存放16位带符号数单元的地址。

Z←((W-X)/5*Y)*2

12

答:MOV AX,W

SUB AX,X

CWD

MOV BX,5

IDIV BX

IMUL Y

SHL AX,1; ((DX),(AX))*2

RCL DX,1

16. 试编制一源程序,统计DA1字单元中含0的个数,如统计的个数为奇数,则将进位位置1,否则进位位清0。

DATA SEGMENT

DA1 DW****

DATA ENDS

STACK1 SEGMENT PARA STACK

DB 10H DUP(0)

STACK1 ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:MOV AX,DATA

MOV DS,AX

MOV DH,0

MOV AX,DA1

MOV CX,16

LOOP:SHL AX,1

JC NEXT1

INC DH

NEXT1:LOOP LOP

CLC

TEST DH,1

JZ END0

STC

END0:MOV AH,4CH

INT 21H

CODE END $

END START

13

发布评论

评论列表 (0)

  1. 暂无评论