当前位置:文档之家› 寻址方式和指令系统

寻址方式和指令系统

寻址方式和指令系统
寻址方式和指令系统

《微机原理》复习思考题第3章 8086的寻址方式和指令系统

3.1 8086汇编语言指令的寻址方式有哪几类?用哪一种寻址方式的指令执行速度最快?

3.2 直接寻址方式中,一般只指出操作数的偏移地址,那么,段地址如何确定?如果要用某个段

寄存器指出段地址,指令中应如何表示?

3.3 在寄存器间接寻址方式中,如果指令中没有具体指明段寄存器,那么,段地址如何确定?

3.4 用寄存器间接寻址方式时,BX,BP,SI,DI分别针对什么情况来使用?这四个寄存器组合

间接寻址时,地址是怎样计算的?举例进行说明。

3.5 设DS=2100H,SS=5200H,BX=1400H,BP=6200H,说明下面两条指令所进行的具体操作:

MOV BYTE PTR [BP], 2000

MOV WORD PTR [BX], 2000

3.6 使用堆栈操作指令时要注意什么问题?传送指令和交换指令在涉及内容操作数时分别要注

意什么问题?

3.7 下面这些指令中哪些是正确的?哪些是错误的?如果是错误的,请说明原因。

XCHG CS, AX

MOV [BX], [1000]

XCHG BX, IP

PUSH CS

POP CS

IN BX, DX

MOV BYTE[BX], 1000

MOV CS, [1000]

3.8 8086系统中,当对SS和SP寄存器的值进行修改时,有什么特殊规定?这样做的原因是什么?[解答] 凡是遇到给SS寄存器赋值的传送指令时,系统会自动禁止外部中断,等到本条指令和下条指令执行之后,又自动恢复对SS寄存器赋值前的中断开放情况。这样做是为了允许程序员连续用两条指令分别对SS和SP寄存器赋值,同时又防止堆栈空间变动过程中出现中断。

3.9 以下是格雷码的编码表

0——0000 1——0001 2——0011 3——0010 4——0110

5——0111 6——0101 7——0100 8——1100 9——1101

请用换码指令和其他指令设计一个程序段,实现格雷码往ASCII的转换。

3.10 用加法指令设计一个简单程序,实现两个16位十进制数的加法,结果放在被加数单元。

3.11 为什么用增量指令或减量指令设计程序时,在这类指令后面不用进位标志CF作为判断依

据?

3.12 用乘法指令时,特别要注意先判断用有符号数乘法指令还是用无符号数乘法指令,这是为

什么?

3.13 字节扩展指令和字扩展指令用在什么场合?举例说明。

[解答] 遇到两个字节相除时,要预先执行CBW指令,以便产生一个双倍长度的被除数。否则就不能正确的执行除法操作。CWD同理。

例如:CBW MOV AL ,a; CWD MOV AX, X;MOV CL , b; MOV CX, Y;CBW AL; CWD AX;DIV AX, CL; DIV AX, CX;

3.14 什么叫BCD码?什么叫组合的BCD码?什么叫非组合的BCD码?8086 汇编语言在对BCD

码进行加、减、乘、除运算时,采用什么方法?

[解答] 在计算机中,可用4位二进制码表示一个十进制码,这种代码叫BCD码;用一个字节表示2位BCD码就是BCD码;计算机对BCD码进行加、减、乘、除运算,通常采用两种办法:一种是在指令系统中设置一套转专用于BCD码的指令;另一种方法是利用对普通二进制数的运算指令算出结果,然后用专门的指令对结果进行调整,或者反过来,先对数据进行调整,再用二进制数指令进行运算。(以上7题由陈军解答)

3.15 用普通运算指令执行BCD码运算时,为什么要进行十进制调整?具体讲,在进行BCD码的加、

减、乘、除运算时,程序段的什么位置必须加上十进制调整指令?

[解答] 在BCD码中,只允许0?/FONT>9这10个数字出现,但有时候的运算结果会超过此范围,因此要进行十进制调整。进行加、件或乘法运算时,调整指令必须紧跟在算术指令后面,在进行除法运算时,调整指令放在除法指令之前。

3.16 普通移位指令(带CF的和不带CF的两类)在执行操作时,有什么差别?在编制乘法程序时,

为什么常用移位指令来代替乘除法指令?试编写一个程序段,实现将BX中的数除以10,结果仍放在BX中。

3.17串操作指令使用时特别要注意和SI,DI这两个寄存器及方向标志DF密切相关。请具体就指

令MOVSB/MOVSW、CMPSB/CMPSW、SCASB/SCASW、LODSB/LODSW、STOSB/STOSW列表说明和SI、DI及DF 的关系。

[解答]

3.18 用串操作指令设计实现以下功能的程序段:首先将100H个数从2170H处搬到1000H处,然

后,从中检索相等于AL中字符的单元,并将此单元值换成空格符。

[解答] BUFF1 EQU,1000H

BUFF2 EQU,2170H

START: MOV SI,OFFSET BUFF2

LEA DI,BUFF1

MOV CX,100H

CYCLE: MOV AL,[SI]

MOV [DI],AL

INC SI

INC DI

LOOP CYCLE

ANOTHER:MOV DI,OFFSET BUFF1

MOV CX,100

CLD

AGE: SCASB

DEC CX

JZ FIN

JNZ AGE

JMP OVER

FIN: MOV [DI],20H

CMP CX,0

JNZ AGE

OVER: RET

3.19 在使用条件转移指令时,特别要注意它们均为相对转移指令,请解释“相对转移”的含义。

如果要往较远的地方进行条件转移,那么,程序中应该怎样设置?

[解答] 只能在从本指令为中心的-128到+127字节范围内转移的称为相对转移。如果要往较远的地方进行条件转移时,可以先用条件转移指令转到附近一个单元,然后,从此单元起放一条无条件转移指令,再通过这条无条件转移指令转到较远的目的地址。

3.20 带参数的返回指令用在什么场合?设栈顶地址为3000H,当执行RET 0006 后,SP的值为

多少?

[解答] 带参数的返回指令可用在这样的情况:主程序为某个子程序提供一定的参数或者参数地址先送到堆栈中,通过堆栈传递给子程序。当栈顶指针SP=3000H,执行RET 0006时,弹出3000H和3001H处的返回地址,腾出3002H?/FONT>3007H的空间,所以SP=3008H。(以上6题由张丽解答)

3.21 用循环控制指令设计程序段,从60H 个元素中寻找一个最大值,结果放在AL中。

[答案] MOV SI, OFFSET DATA1 ; 将数据起始地址送SI

MOV CX, 5FH ; 有60H-1次循环

MOV AL, [SI] ; 将第一个元素放AL中

COMPARE: INC SI

CMP AL, [SI]

JL XCHMAX

JMP NEXT

XCHMAX: MOV AL, [SI]

NEXT: LOOP COMPARE

3.22 中断指令执行时,堆栈的内容有什么变化?中断处理子程序的人口地址是怎样得到的? [答案] 中断指令执行时,堆栈内容变化如下:标志寄存器被推入堆栈,且SP减2,然后CPU 将主程序的下一条指令地址即断点地址的段值和偏移量推入堆栈,且SP减4。

某中断处理子程序的入口地址即中断向量,由该中断类型号的4倍为内存地址,在该地址处的4个字节内容即该中断向量。

3.23 中断返回指令IRET和普通子程序返回指令RET 在执行时,具体操作内容什么不同?

[答案] IRET须弹出堆栈中标志寄存器的值,而RET则不需要。

3.25 HLT指令用在什么场合?如CPU 在执行HLT 指令时遇到硬件中断并返回后,以下应执行哪

条指令?

[答案] HLT用在使CPU处于暂停状态而等待硬件中断的场合。

在执行HLT指令遇到硬件中断并返回后将执行HLT后面的一条指令。

3.27 设当前SS=2010H,SP=FE00H,BX=3457H,计算当前栈顶的地址为多少?当执行PUSH BX 指

令后,栈顶地址和栈顶2个字节的内容分别是什么?

[答案] 当前栈顶的地址 2010H*16+FE00H=2FF00H;执行PUSH BX指令后,堆栈地址指针SP 减2,则栈顶地址为2FEEDH;栈顶2个字节的内容为57H、34H。

3.28 在DS段中有一个从TABLE开始的由160个字符组成的链表,设计一个程序,实现对此表进

行搜索,找到第一个非0元素后,将此单元和下一单元清0。( 以上由王龙输入 )

[答案] MOV CX, SEG TABLE

MOV DS, CX ;将段地址送DS

MOV SI, OFFSET TABLE ;表偏移量送SI

MOV CX, 160 ;字节数

XOR AL, AL

NEXT: CMP AL, [SI]

JNE EXIT1

INC SI

LOOP NEXT

EXIT1: MOV [SI], AL

INC SI

MOV [SI], AL

3.29 下面的程序段将ASCII码的空格字符填满100个字节的字符表。阅读这一程序,画出流程,

并说明使用CLD指令和REP STOSB指令的作用,再指出REP STOSB指令执行时和那几个寄存器的设置有关?

MOV CX, SEG TABLE ; TABLE为字节表表头

MOV ES, CX

MOV DI, OFFSET TABLE ; DI指向字节表

MOV AL, ' '

MOV CX, 64H ; 字节数

CALL FILLM ; 调用数子程序

...

...

FILLM: JCXZ EXIT ; CX为0则退出

PUSH DI ; 保存寄存器

PUSH CX

CLD

REP STOSB ; 方向标志清零

POP CX ; 重复填数

POP DI

EXIT: RET

[答案]CLD指令作用:方向标志清0;REP STOSB指令作用:重复CX次将AL中的字节填入[ES:DI]为起始的表内,DI增量、减量根据DF确定:DF=0,DI每次增量;DF=1,DI每次减量。STOSB 指令执时,与AX、ES、DI寄存器和Flag的DF位设置有关。流程图:

3.30 下程序将一个存储块的内容复制到另一个存储快,进入存储段时,SI中为源区起始地址的

偏移量,DI中为目的区起始地址的偏移量,CX中为复制的字节数。阅读程序并说明具体的REP MOCSB指令使用与那些寄存器有关?

PUSH DI ; 保存寄存器

PUSH SI

PUSH CX

CMP DI, SI ; 看源区和目的区的地址哪个高

JBE LOWER ; 如目的区地址底,则转移

STD ; 如目的区地址高,则设方向标志为1

ADD SI, CX ; 从最后一个字节开始复制

DEC SI ; 调整源区地址

ADD DI, CX

DEC DI ; 调整目的区地址

JMP MOVEM

LOWER: CLD ; 从第一个字节开始复制

MOVEM: REP MOVSB

POP CX

POP SI

POP DI

RET

[答案] REP MOVSB 的作用是重复CX次将[DS:SI]中字节传送到[ES:DI]中。SI、DI加或减1由DF确定,DF=0,加。REP使CX减1,到0后结束传送。所以 REP MOVSB 指令与CX、SI、DI、ES、DS寄存器和Flag的DF位设置有关。

3.31 下面的程序实现对两个存储区中的字进行比较。如找到一对不同的字,则退出,此时,ZF

为0,DI 指向此字;如两个存储区冲所有的字一一象同,则退出程序时,CX中植为0,ZF 为1。阅读这一程序段,并仿此设计一个比较字节块的程序段。

MATT: MOV SI, OFFSET SOURCE ; 源区首址

MOV DI, OFFSET TARGET ; 目的区首址

MOV CX, NUMBER

JCXZ EXIT ; 如CX为0,则结束

PUSH CX ; 保存有关寄存器

PUSH SI

PUSH DI

CLD ; 清方向标志

REPE CMPSW

JZ MATCH ; 比较

PUSHF ; ZF为1,则转移

SUB DI, 2 ; ZF为0,则DI指向次字

POPF

JMP EXIT ; 推出

MATCH: POP DI ; 恢复寄存器

POP SI

POP CX

EXIT: RET

[答案] 将上面程序中的“REPE C MPSW 改为REPE CMPSB”、“SUB DI, 2 改为DEC DI”即可,其余不变。

3.32 下面的程序实现在TABLE 为起始地址的100个字符长度的表中检索“$"字符。分析程序,

然后说明REPNE SCASB指令的具体执行过程。

START: MOV CX, SEG TABLE ; 表段地址送ES

MOV ES, CX

MOV DI, OFFSET TABLE ; 表偏移量送DI

MOV AL, '$' ; 检索的关键字

MOV CX, 64H ; 检索的字节数

PUSH DI ; 保存起始地址

CLD ; 清除方向标志

REPNE SCASB ; 检索

JNZ NFOUN ; 如未找到,则转移

SUB DI, 1 ; 找到,则指向次字符

JMP EXIT

NFOUN: POP DI ; 恢复起始地址

EXIT: RET ;(以上由1007孙成长输入)

[答案]REPNE SCASB 指令的作用将AL中的字节与[ES:DI]中的字节比较,不相等则DI加或减1后继续比较。这样可以在[ES:DI]起始的内存中检索到字节AL,一旦找到则操作结束,一直未找到则重复CX次。( 以上6题由张娅琴解答 )

3.33 下面的程序实现两个32位不带符号的想乘,被乘数在DX和AX寄辰器中,乘数在CX和BX

寄辰器中,最后的64位乘积在DX,CX,BX,AX中。图3-33说明乘法过程。读懂程序段和附图,并自己设计一个程序,实现一个16位数和一个32位无符号数相乘。

STAT: JMP MUL64

HI0 DW ?

LO0 DW ?

HI1 DW ?

LO1 DW ?

HI2 DW ?

LO2 DW ?

HI3 DW ?

LO3 DW ?

HI4 DW ?

LO4 DW ?

MUL64: MOV HI0, DX ; 保存被乘数

MOV LO0, AX

MUL BX ; 得部分乘积1

MOV HI1, DX ; 保存部分乘积1

MOV LO1, AX

MOV AX, HI0 ; 得部分乘积2

MUL BX

MOV HI2, DX ; 保存部分乘积2

MOV LO2, AX

MOV AX, LO0 ; 得部分乘积3

MUL CX

MOV HI3, DX ; 保存部分乘积3

MOV LO3, AX

MOV AX, HI0 ; 得部分乘积4

MUL CX

MOV HI4, DX ; 保存部分乘积4

MOV LO4, AX

MOV AX , LO1 ; 乘积的低16位在AX中

MOV BX, HI1 ; 乘积的次低16位在BX中 ADD BX, LO2

ADC HI2, 0

ADD BX, LO3

MOV CX, HI2 ; 乘积的次高16位在CX中 ADC HI4, 0

ADD CX, LO4

MOV DX, HI4 ; 乘积的高16位在DX中

ADC DX, 0

RET

[答案] ; (DX、AX)*CX->DX、CX、AX,为无符号数

START: JMP MUL48

MUL48:MOV BX, DX ; 先保存DX

MUL CX ; AX*CX->DX、AX

MOV SI, AX ; 将部分积结果保存到DI、SI MOV DI, DX

MOV AX, BX

MUL CX ; DX*CX->DX、AX

MOV CX, DI

ADD CX, AX ; 得到中间16个字节

MOV AX, SI ; 低16个字节

ADC DX,0 ; 高16个字节

RET

3.34 下面的程序实现两个32位带符号数的乘法,其中调用了题3.33中的非符号数相乘的程序MUL64,结果放在DX、CX、BX、AX四个寄存器中,进入程序时,DX、AX中为被乘数,CX、BX中为乘数。读懂程序后再设计一个16位带符号数和32位带符号数相乘程序。

MULS64: MOV [1000], 0 ; 1000单元作为负数标志

CMP DX, 0 ; 乘数为负数吗?

JNS CHKK ; 否,则转CHKK

NOT AX ; 是,则取补码

NOT DX

ADD AX, 1

ADC DX, 0

NOT [1000] ; 负数标志置1

CHKK: CMP CX, 0 ; 乘数为负数吗?

JNS GOMUL ; 否,则转GOMUL

NOT BX ; 是,则取补码

NOT CX

ADD BX, 1

ADC CX, 0

NOT [1000] ; 将负数标志取反 ( 以上由魏运龙输入 )

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

GONUL: CALL MUL64 ; 调用非符号数乘法程序

CMP [1000], 0 ; 结果为正数吗?

JZ EXIIT ; 是正数,则转移

NOT AX ; 是负数,则取补码

NOT BX

NOT CX

NOT DX

ADD AX, 1

ADC BX, 0

ADC CX, 0

ADC DX, 0

EXIIT: RET

[答案]; (DX、AX)*CX->DX、CX、AX,为有符号数

MULS48:MOV [1000], 0 ; 1000单元作为负数标志

CMP DX, 0 ; 乘数为负数吗?

JNS CHKK ; 否,则转CHKK

NOT AX ; 是,则取补码

NOT DX

ADD AX, 1

ADC DX, 0

NOT [1000] ; 负数标志置1

CHKK: CMP CX, 0 ; 乘数为负数吗?

JNS GOMUL ; 否,则转GOMUL

NOT CX ; 是,则取补码

ADD CX, 1

NOT [1000] ; 将负数标志取反

GONUL: CALL MUL48 ; 调用32位*16位无符号数乘法程序

CMP [1000], 0 ; 结果为正数吗?

JZ EXIT0 ; 是正数,则转移

NOT AX ; 是负数,则取补码

NOT CX

NOT DX

ADD AX, 1

ADC CX, 0

ADC DX, 0

EXIT0: RET

3.35 下面的一个实现16位非组合BCD码相加的程序段,阅读这一程序段后再设计一个实现16

位非组合BCD码减法的程序。

ANBCD: MOV CH, AH ; 进入程序段时,AX中为第二个操作数

ADD AL, BL ; BX中为被加数,实现低8位相乘

AAA

XCHG AL, CH

ADC AL, BH ; 实现高8位相加

AAA

MOV AH, AL ; 和保存在AX中

MOV AL, CH

RET

[答案] SUBCD: MOV CH, AH ; AX-BX->AX,为非组合BCD码

SUB AL, BL

AAS

XCHG AL,CH

SBB AL,BH

AAS

MOV AH,AL

MOV AL,CH

RET

3.36 下面的程序实现两个16位组合BCD码相减,进入程序时,BX中为减数,AX中为被减数,

程序执行后,结果在AX中。请仿照这一程序段设计两个16位组合BCD码相加的程序。

STASUB: MOV CH, AH ; 保存高8位

SUB AL, BL ; 低8位相减

DAS ; 十进制调整

XCHG AL, CH

SBB AL, BH ; 高8位相减

DAS

MOV AH, AL ; 结果在AX中

MOV AL, CH

RET

[答案]STAADD: MOV CH, AH ; AX+BX->AX,为组合BCD码

ADD AL,BL

DAA

XCHG AL,CH

ADC AL,BH

DAA

MOV AH,AL

MOV AL,CH

RET

3.37 下面是一个实现组合的32位BCD码除以组合的16位BCD码的程序,结果得到16位组合的

BCD码的商和16位的BCD码余数。进入程序时,被除数在DX.AX中,除数在BX中,程序执行后,商在AX中,余数在DX中,请为子程序TBCD加上详细注释,再分析整个程序,并画出详细流程图。

DIBCD: PUSH AX ; 被除数低16位进堆栈

MOV AX, BX ; 除数送AX

CALL BCD2 ; 将除数转化为二进制数

MOV BX , AX ; 除数送回BX

MOV AX, DX ; 将被除数高16位转换为二进制数

CALL BCD2

MOV CX, 10000 ; 被除数高16位乘10000

MUL CX

MOV SI, AX ; 被除数高16位保存到SI

POP AX

CALL BCD2 ; 被除数低16位转换为二进制数

ADD AX, SI

ADC DX, 0 ; DX和AX中得到二进制被除树

DIV BX ; 除法运算

MOV CX, AX ; 商存入CX

MOV AX, DX ; 余数存入AX

CALL TWBCD ; 余数转换为BCD码

MOV DX , AX ; 余数送 DX

MOV AX, CX ; 商转换为BCD码

CALL TWBCD

RET

BCD2: MOV SI, AX

SUV AX, AX

CALL CONVER ; 转换最高一个BCD码(4位二进制)

CALL CONVER ; 转换次高一个BCD码

CALL CONVER ; 转换次低一个BCD码

CALL CONVER ; 转换最低一个BCD码

RET

CONUER: MOV DI, 0 ; 清DI

MOV CX, 4 ; 四次移位

SHIF: SHL SI, 1 ; 左移一次

RCL DI, 1 ; 左移的数位进入DI

LOOP SHIF

MOV CX, 10 ; 结果乘10

MUL CX

ADD AX, DI ; 加上新的数, 结果在AX中

RET

TWBCD: CMP AX, 9999 ; 数据是否太大

JBE TBCD ; 否, 则转2BCD

STC

JC EXIT ; 是,则退出 ( 以上由?输入 )

-----------------------------------------------------

TBCD: SUB DX, DX ; DX清零

MOV CS, 1000 ; 原数为1000

DIV CX

XCHG AX, DX ; 交换AX,DX的值

MOV CL, 4

SHL DX, CL ; 左移位4次,将已转化好的BCD码放在DX中 MOV CL, 100 ; 余数为100

DIV CL

ADD DL, AL

MOV CL, 4

SHL DX, CL

XCHG AL, AH ; 剩余的余数继续作除运算

SUB AH, AH ; 将AH置0

DIV CL

ADD DL, AL

MOV CL, 4

SHL DX, CL

ADD DL, AH

MOV AX, DX

EXIT: RET

3.38 以下程序将一个8位二进转换为2位BCD数字,进入程序时,AL中为二进制数,退出程序

时,如CF为0,则AL中为BCD数字,如CF为1,则表示由于输入值超出范围故结果无效。

阅读下面程序后,画出流程图,然后设计一个将组合的BCD码(2位)转换为8位二进制数的程序。

START: CMP AL, 99 ; 是否超出范围?

JBE STRAT

STC ; 是,则转EXIT,并给CF置1

JC EXIT

STRAT: MOV CL, 10 ; 10作为除数

XOR AH, AH

CBW ; 将AL中数扩展到AH

DIV CL ; 除法结果AL中为高位,AH中为低位

MOV CL, 4

SHL AL, CL ; 左移4位

OR AL, AH ; 合成BCD码在AL中

EXIT: RET ;(以上6题由张琼仙解答)

3.39 下面程序用XLAT指令将二进制数转换成16进制数,阅读下面程序,体会XLAT换码指令的

用法,然后,设计一个查表程序,实现按学号查找学生姓名的功能。

START: JMP BINASC

ASCII DB '0123456789ABCDEF'

BINASC: PUSH BX

AND AL, 0FH ; 清除AL中高4位

LEA BX,ASCII ; BX指向ASCII表

XLAT ; 转换为ASCII码

POP BX

RET

[解答]START: JMP BINASC

ASCII DB '0123456789ABCDEF'

BINASC: PUSH BX

AND AL,0FH ; 清除AL中高4位

LEA BX,ASCII ; BX指向ASCII表

XLAT ; 转换为ASCII码

POP BX

RET

答: BUFF DB 32

DB ?

DB 32DUP(?)

START: JMP INPUT

NAME DB 'ZHAOQIAN

INPUT: MOV DX,OFFSET BUFF

MOV AH,0AH

INT 21H

MOV DX,AX ;将输入的学号放入dx中

PUSH DX ;DX入栈保护

JMP BINASC

BINASC:POP DX

MOV AX,DX ;放入ax中

PUSH BX

LEA BX,NAME

XLAT ;即(AX)←((BX)+(AX))名字取出放入ax中

POP BX

RET

3.40 下面的程序将两个字符串全并为一个字符串。在进入程序前,设第一个字符串的地址偏移

量和字符串长度已分别放在DI和BX中,第二个字符串的地址偏移量和字符串长度则分别放在SI和CX中。阅读下面程序并画出流程图,在此基础上,再设计一个将3个字符串全并为一个字符串的程序(设进入程序前第三个字符串的地址偏移量和字符串的长度分别在DX和AX中)。

START: JCXZ EXIT ; 如第二串长度为0,则退出

CMP BX, 0

JEE EXIT ; 如第一串长度为0, 则退出

PUSH DI ; 保存第一串地址

PUSH CX

PUSH DI

ADD DI, BX ; 计算第一串末地址

CMP SI, DI ; 第一串末地址是否超过第二串首地址?

JA OKOK1 ; 否, 则转

POP DI

PUSH SI ; 保存第二串地址

ADD SI, CX ; 计算第二串地址

CMP SI, DI ; 第二串末地址是否高于第一串首地址 POP SI

JBE OKOK2 ; 否, 则转

SUB DI, DI ; 是, 则使ZF为0, 且退出

JZ EXEX

OKOK1: POP DI

OKOK2: CLD ; 连接两个字符串

REP MOVSB

MOV SI, DI ; SI指向新串首址

POP CX

ADD BX, CX ; BX为新串长度

EXEX: POP CX

POP DI

EXIT: RET ; ( 以上由王素芬输入 )

[解答] START: JCXZ EXIT ; 如第二串长度为0,则退出

CMP BX, 0

JEE EXIT ; 如第一串长度为0, 则退出

PUSH DI ; 保存第一串地址

PUSH CX

PUSH DI

ADD DI, BX ; 计算第一串末地址

CMP SI, DI ; 第一串末地址是否超过第二串首地址?

JA OKOK1 ; 否, 则转

POP DI

PUSH SI ; 保存第二串地址

ADD SI, CX ; 计算第二串地址

CMP SI, DI ; 第二串末地址是否高于第一串首地址

POP SI

JBE OKOK2 ; 否, 则转

SUB DI, DI ; 是, 则使ZF为0, 且退出

JZ EXEX

OKOK1: POP DI

OKOK2: CLD ; 连接两个字符串

REP MOVSB

MOV SI, DI ; SI指向新串首址

POP CX

ADD BX, CX ; BX为新串长度

EXEX: POP CX

POP CI

EXIT: RET ; ( 以上由王素芬输入 )

答:

START: JCXZ EXIT ;

JBXZ EXIT ;

CMP AX,0 ;

JEE EXIT ;如果长度为0则退出

PUSH DI ;

PUSH CX ;

PUSH DI ;

ADD DI,BX ;

CMP SI,DI ;看一末地址是否高于二的首地址JA OKOK1 ;否,转

POP DI ;

PUSH SI ;

ADD SI,CX ;

CMP SI,DI ;

POP SI ;二末地址是否高于一首地址

JBE OKOK3 ;否,转

SUB DI,DI ;是,zf为0,退出

PUSH SI ;

PUSH AX ;

PUSH SI ;

ADD SI,CX ;

CMP DX,SI ;二末地址是否高于三首地址

JA OKOK2 ;否,转

POP SI ;

PUSH DX ;

ADD DX,AX ;

CMP DX,SI ;

POP DX ;三末地址是否高于二首地址

JBE OKOK4 ;否,转

SUB SI,SI ;是,zf为0,退出

JZ EXEX ;

OKOK1: POP DI ;

OKOK2: POP SI ;

OKOK3: CLD 连接一和二生成新一

REP MOVSB ;

MOV SI,DI ;

POP CX ;

ADD BX,CX ;

OKOK4: CLD 连接新一和三

MOV AX,SI ;

POP DX ;

ADD BX,DX ;bx为总长

EXEX: POP AX ;

POP DX ;

EXIT: RET ;

3.41 下列程序将第二个字符串插入第一个字符串中的指定位置,为此要在插入点处将第一串的

后面部分往后移动相当于第二串长度的空间,设进入程序时,第一串的地址偏移量和字符串长度分别在DI和BX中,第二串的地址偏移量和字符长度分别在SI和CX中,BP为插入点的偏移量。阅读程序并画出流程,再说明ZF在程序中的作用,并对插入过程作详细注释。

START: JMP INSERT ;[解答] SIZE2 DW ? ; 保存CX用

OFF1 DW ? ; 保存DI用

INSERT: JCXZ QUIT ; 第二串为空串,则退出

CMP BX, 0

JE QUIT ; 第一串为空串,则退出

MOV SIZE2, CX ; 保存CX

MOV OFF1, DI ; 保存DI

ADD DI, BX

CMP SI, DI ; 第二串是否已在第一串中?

JAE OKOK ; 否,则转

PUSH SI

ADD SI, CX

CMP SI, OFF1 ; 第一串是否覆盖第二串?

POP SI

JBE OKOK ; 否,则转

SUB DI, DI ; 使ZF为0

JZ EXIT

OKOK: STD ; 完成插入ZF的作用是控制程序的结束。

PUSH DI ;DI入栈保存

MOV SI, DI ;SI指向一的末地址

ADD DI, CX;第一串空出第二串的位置

MOV CX, SI

SUB CX, BP

INC CX ;从插入点以后的字符开始后移

REP MOVSB

CLD

POP SI ;SI指向第二串字符

MOV CX, SIZE2 ;CX为第二串的长度

MOV DI, BP ;DI指向插入点

REP MOVSB

MOV SI, BP ; SI指向新址

ADD BX, SIZE2 ; BX为新串长

EXIT: MOV DI, OFF1 ; 恢复DI

MOV CX, SIZE2 ; 恢复CX

QUIT: RET ; ( 以上由康延魁输入 ) (以上3题由许振华解答)

寻址方式及指令系统习题与解答

寻址方式及指令系统习题与解答 计算机科学与工程学院黄洪波2012年3月 一、单项选择题 1.设BX=2000H,SI=3000H,指令MOV AX,[BX+SI+8]的源操作有效地址为()。 A.5000H B.5008H C.23008H D.32008H 2.设DS=1000H,ES=2000H,BX=3000H,指令ADD AL,[BX]的源操作数的物理址为()。 A.13000H B.23000H C.33000H D.3000H 3.设DS=2000H,ES=3000H,SI=200H,指令MOV ES:[SI],AL的目的操作数的物理地址为()。 A.20200H B.30200H C.50200H D.200H 4.指令MOV MEM[BX],AX中的MEM是()。 A.原码B.反码C.补码D.移码 5.用来作为寄存器间接寻址的寄存器有()个。 A.8 B.6 C.5 D.4 6.指令MOV [BX+SI],AL中的目的操作数使用()段寄存器。 A.CS B.DS C.SS D.ES 7.指令MOV BX,[BP+5]中的源操作数使用()段寄存器。 A.CS B.DS C.SS D.ES 8.段内间接寻址只改变()中的内容。 A.CS B.IP C.CS和IP D.PSW 9.段间间接寻址只改变()中的内容。 A.CS B.IP C.CS和IP D.PSW 10.下述指令中不改变PSW的指令是()。 A.MOV AX,BX B.AND AL,0FH C.SHR BX,CL D.ADD AL,BL 11.下述指令中不影响CF的指令是()。 A.SHL AL,1 B.INC CX C.ADD [BX],AL D.SUB AX,BX 12.两个整数补码9CH和7AH相加运算后,会产生()。 A.无溢出且无进位B.无溢出但有进位

作业习题 寻址方式和指令

寻址方式和指令习题 一、选择题 1、MOVX A,@DPTR指令中源操作数的寻址方式是() (A)寄存器寻址(B)寄存器间接寻址(C)直接寻址(D)立即寻址 2、ORG 0003H LJMP 2000H ORG 000BH LJMP 3000H 当CPU响应外部中断0后,PC的值是() (A)0003H (B)2000H (C)000BH (D)3000H 3、执行PUSH ACC指令,MCS-51完成的操作是() (A)SP+1 SP (ACC)(SP)(B)(ACC)(SP)SP-1 SP (C)SP-1 SP (ACC)(SP) (D)(ACC)(SP)SP+1 SP 4、LCALL指令操作码地址是2000H,执行完相子程序返回指令后,PC=() (A)2000H (B)2001H (C)2002H (D)2003H 5、51执行完MOV A,#08H后,PSW的哪一位被置位() (A)C (B)F0 (C)OV (D)P 6、下面条指令将MCS-51的工作寄存器置成3区() (A)MOV PSW,#13H (B)MOV PSW,#18H (C)SETB PSW.4 CLR PSW.3 (D) SETB PSW.3 CLR PSW.4 7、执行MOVX A,@DPTR指令时,MCS-51产生的控制信号是()(A)/PSEN (B)ALE (C)/RD (D)/WR 8、MOV C,#00H的寻址方式是() (A)位寻址(B)直接寻址(C)立即寻址(D)寄存器寻址 9、ORG 0000H AJMP 0040H ORG 0040H MOV SP,#00H 当执行完上面的程序后,PC的值是()

8086汇编语言指令的寻址方式有哪几类

1. 8086汇编语言指令的寻址方式有哪几类?用哪一种寻址方式的指令执行速度最快? 寄存器寻址最快 7. 下面这些指令哪些是正确的?哪些是错误的?如是错误的,请说明原因。 XCHG CS , AX ;不能修改CS MOV [BX] , [1000] ;不能在两个内存单元之间直接进行数据传送 XCHG BX , IP ;不能用名字直接访问IP PUSH CS POP CS ;不允许直接修改CS值 IN BX , DX ;输入数据必须使用累加器AL或AX MOV BYTE [BX] , 1000 ;格式错误,且超范围,应为MOV word PTR [BX],1000 MOV CS , [1000];不允许直接修改CS值 20.带参数的返回指令用在什么场合?设栈顶地址为3000H,当执行RET 0006后,SP的值为多少? 利用堆栈传递参数时使用;对于近调用SP=3008H,对于远调用SP=300AH 27.设当前SS=2010H,SP=FE00H,BX=3457H,计算当前栈顶地址为多少?当执行 PUSH BX指令后,栈顶地址和栈顶2个字节的内容分别是什么? 栈顶地址:SS:SP,物理地址为:2FF00H;PUSH 完以后栈顶地址为:SS:SP=2010:FDFEH,即物理地址为:2FEFEH,内容为:57H 34H(由低地址到高地址) B P7 5. 设(DS)=3000H,(BX)=1100H,(CS)=0062H,(S1)=0002H,(31100H)=52H, (31101H)=8FH,(31162H)=6BH,(31163H)=99H,(31103H)=F6H, (32200H)=AAH,(32201H)=B6H,(32800H)=55H,(32801H)=77H,给出下列各指令执行后AX寄存器的内容: (1) MOV AX,BX (2) MOV AX,[BX] (3) MOV AX,4200H (4) MOV AX,[2800H] (5) MOV AX,1100H[BX] (6) MOV AX,[1160H+SI] 9. 分别执行下列各指令组,写出AX的内容: (1) MOV AX,93A4H NEG AX 73A4-8c5c,e689-1977 (AX)=6C5CH (2) XY DW "AB" MOV AX,XY (AX)=4142H (3) MOV AX,2B7EH MOV CX,4DB5H ADD AX,CX (AX)=7933H (4) XA DW 0BD57H MOV AX,0FBCDH AND AX,XA (AX)=B945H (5) STC MOV BX, 0B69FH MOV AX, 43A2H SBB AX, BX

实验一 指令与寻址方式认知实验(Keil)

实验一指令与寻址方式认知实验 一、实验目的 1.了解单片机基本指令及其寻址方式; 2.掌握在μVision环境中查看指令操作结果的技巧。 二、实验仪器和设备 Keil软件;THKSCM-2综合实验装置; 三、实验原理及实验内容 1.示例及相关设置 (1)建立一个文件夹:lx31。 (2)利用菜单File的New选项进入编辑界面,输入下面的源文件,以lx31.asm文件名存盘到lx31文件夹中。 ORG 0000H MAIN:MOV R7,#16 MOV A,#00H MOV R0,#30H LP:MOV @R0,A INC R0 INC A DJNZ R7,LP SJMP $ END (3)在lx31文件夹下建立新工程,以文件名lx31存盘(工程的扩展名系统会自动添加)。 (4)在Project菜单的下拉选项中,单击Options for Target ‘Target1’,在弹出的窗口中要完成一下设置: ○1单片机芯片选择AT89C51选择完器件,按“确定”后会弹出一个提示信息框,提示“Copy Startup Code to Project Folder and Add File to Project?”,选择“是”。 ○2晶振频率设为11.0592MHz。 ○3Output标签下的Create HEX File前小框中要打钩。

○4在Debug标签选择Use Simulator(软件模拟)。 (5)在Project菜单的下拉选项中,单击build Target 选项完成汇编,生成目标文件(.HEX)。利用单步、执行到光标处两种方法运行程序,观察程序运行的结果。 (6)分析程序的功能,研究观察以下指令的寻址方式及其操作效果。 2.示例及相关设置 (1)建立一个文件夹:lx32。 (2)利用菜单File的New选项进入编辑界面,输入下面的源文件,以lx32.asm文件名存盘到lx32文件夹中。 ORG 0000H MOV R0,#20H MOV R1,#22H MOV A,@R0 ADD A,@R1 MOV 24H,A INC R0 INC R1 MOV A,@R0 ADDC A,@R1 MOV 25H,A SJMP $ END (3)在lx32文件夹下建立新工程,以文件名lx32存盘(工程的扩展名系统会自动添加)。 (4)在Project菜单的下拉选项中,单击Options for Target ‘Target1’,在弹出的窗口中要完成一下设置: ○1单片机芯片选择AT89C51选择完器件,按“确定”后会弹出一个提示信息框,提示“Copy Startup Code to Project Folder and Add File to Project?”,选择“是”。 ○2晶振频率设为11.0592MHz。 ○3Output标签下的Create HEX File前小框中要打钩。 ○4在Debug标签选择Use Simulator(软件模拟)。

第六章_寻址方式和指令系统

1

第 6章 寻址方式和汇编指令 第6章
6.1、寻址方式 6.2、汇编语言指令集 6.3、汇编源程序

第 6章 寻址方式和汇编指令 第6章
6 . 1 寻址方式
▲ 汇编指令是可执行指令,每条指令对应一条机器 码,用以控制处理器中的执行部件进行各种操 作。 ▲ TMS320F281X系列的汇编指令有150多条。 ▲ 它们支持各种信号处理运算,同时也提供了应用 中所需要的多级处理和过程控制功能。 ▲ 寻址方式是指寻找指令中操作数地址的方式。

第 6章 寻址方式和汇编指令 第6章
6 . 1 寻址方式
TMS320C28x指令集采用7种存储器寻址方式: ▲ 直接寻址方式 ▲ 堆栈寻址方式 ▲ 间接寻址方式 ▲ 寄存器寻址方式 ▲ 数据/程序/IO空间立即寻址方式 ▲ 程序空间间接寻址 ▲ 字节寻址方式

第 6章 寻址方式和汇编指令 第6章
6 . 1 寻址方式
F2812 的大多数指令利用操作码中的8位字段来选择寻 址方式和对寻址方式进行修改.在 F2812 指令系统中,这个8 位字段用于以下寻址方式: (1)loc16 。 为16位数据访问选择直接/堆栈/间接/寄存器寻址方
式。
(2)loc32 。 为32位数据访问选择直接/堆栈/间接/寄存器寻址方
式。
以上7种寻址方式都与“loc16/loc32”组合起来使用。

第 6章 寻址方式和汇编指令 第6章
6 . 1 寻址方式
寻址方式选择位
由 于 F2812 提 供 了 多 种 寻 址 方 式 , 因 此 用 寻 址 方 式 选 择 位 ( AMODE )来选择8位字段( loc16/loc32 )的解码。该 位属于状态寄存器ST1。寻址方式可以大致归类如下: ▲ AMODE=0——该方式是复位后的默认方式,也是F2812的C/C++编译
器使用的方式。这种方式与C2xLP CPU的寻址方式不完全兼容。数据页指针 偏移量是6位(在C2xLP CPU中是7位),并且不支持所有的间接寻址方式。
▲ AMODE=1——该方式包括的寻址方式完全与C2xLP 器件的寻址方式
兼容。数据页指针的偏移量是7位并支持所有C2xLP 支持的间接寻址方式。
对与loc16或者loc32字段,其可用的寻址方式总结如P375所示

寻址方式和指令系统

《微机原理》复习思考题第3章 8086的寻址方式和指令系统 3.1 8086汇编语言指令的寻址方式有哪几类?用哪一种寻址方式的指令执行速度最快? 3.2 直接寻址方式中,一般只指出操作数的偏移地址,那么,段地址如何确定?如果要用某个段 寄存器指出段地址,指令中应如何表示? 3.3 在寄存器间接寻址方式中,如果指令中没有具体指明段寄存器,那么,段地址如何确定? 3.4 用寄存器间接寻址方式时,BX,BP,SI,DI分别针对什么情况来使用?这四个寄存器组合 间接寻址时,地址是怎样计算的?举例进行说明。 3.5 设DS=2100H,SS=5200H,BX=1400H,BP=6200H,说明下面两条指令所进行的具体操作: MOV BYTE PTR [BP], 2000 MOV WORD PTR [BX], 2000 3.6 使用堆栈操作指令时要注意什么问题?传送指令和交换指令在涉及内容操作数时分别要注 意什么问题? 3.7 下面这些指令中哪些是正确的?哪些是错误的?如果是错误的,请说明原因。 XCHG CS, AX MOV [BX], [1000] XCHG BX, IP PUSH CS POP CS IN BX, DX MOV BYTE[BX], 1000 MOV CS, [1000] 3.8 8086系统中,当对SS和SP寄存器的值进行修改时,有什么特殊规定?这样做的原因是什么?[解答] 凡是遇到给SS寄存器赋值的传送指令时,系统会自动禁止外部中断,等到本条指令和下条指令执行之后,又自动恢复对SS寄存器赋值前的中断开放情况。这样做是为了允许程序员连续用两条指令分别对SS和SP寄存器赋值,同时又防止堆栈空间变动过程中出现中断。 3.9 以下是格雷码的编码表 0——0000 1——0001 2——0011 3——0010 4——0110 5——0111 6——0101 7——0100 8——1100 9——1101 请用换码指令和其他指令设计一个程序段,实现格雷码往ASCII的转换。 3.10 用加法指令设计一个简单程序,实现两个16位十进制数的加法,结果放在被加数单元。 3.11 为什么用增量指令或减量指令设计程序时,在这类指令后面不用进位标志CF作为判断依 据?

存储器寻址方式

存储器寻址方式 存储器寻址方式的操作数存放在主存储器中,用其所在主存的位置表示操作数。在这种寻址方式下,指令中给出的是有关操作数的主存地址信息。8088的存储器空间是分段管理的。程序设计时采用逻辑地址;由于段地址在默认的或用段超越前缀指定的段寄存器,所以采用偏移地址,称之为有效地址(Effective Address, EA) 1.直接寻址 在这种寻址方式下,指令中直接包含了操作数的有效地址,跟在指令操作码之后。其默认的段地址在DS段寄存器中,可以采用段超越前缀。 例将数据段中偏移地址2000H处的内存数据送至AX寄存器。 MOV AX, [2000H] 该指令中给定了有效地址2000H, 默认与数据段寄存器DS一起构成操作数所在存储单元的物理地址。 如果DS=1429H,则操作数所在的物理地址为1429H*16+2000H=16920H. 该指令的执行结果是将16920H单元的内容传送至AX寄存器,其中,高字节内容送AH寄存器,低字节内容送AL寄存器。

MOV AX, [2000H];指令代码:A1 00 20 例: 将附加段中偏移地址2000H 处的内存数据送至AX 寄存器。 MOV AX, ES:[2000H]; 指令代码:26 A1 00 20 变量指示内存的一个数据,直接引用变量就是采用直接寻址方式。变量应该在数据段进行定义,常用的变量定义伪指令DB 和DW 分别表示字节变量和字变量,例如 WV AR DW 1234H; 定义字变量WV AR ,它的初值是1234H 这样,标示符WV AR 表示具有初值1234H 的字变量,并由汇编程序为它内存分配了两个连续的字节单元。假设它在数据段偏移地址是0010H 。 例:将数据段的变量WV AR (即该变量名指示的内存单元数据)送至AX 寄存器。 MOV AX, WV AR; 指令功能: 上述指令实质就是如下指令: AX WV AR AX DS :[0010H]

指令格式及寻址方式

指令格式及寻址方式 一、指令格式 指令的表示方法称为指令格式,它包括指令的长度和指令内部信息的安排等内容。一条指令一船由两部分组成,即操作码和操作数。操作码用来规定指令进行什么操作,而操作效则表示指令操作的对象。操作数可以直接是一个数(立即数),也可以是一个数据所在的空间地址,即在执行指令时从指定的地址空间取出操作数。 单片机中的指令并不是固定的长度,对于不同的指令,指令的字节数不同。MC5—5l 单 片机用机器语言表示的指令格式按字节划分,有一字节指令、两字节指令和三字节指令三种。 1.一字节指令 一字节指令中的8位二进制代码既包含操作码的信息,也包含操作数的信息。在一字节指令中,有些指令的指令码中隐合着对某一寄存器的操作,NXP代理商无需再具体指定操作数。例如数 据指针DPTR加1指令;INC DPTR,其指令码为: 另外有些指令的操作数在通用寄存器中,由指令码中的rrr三位的不同编码来指定该 寄存器。例如:寄存器向氮加器A传送数据指令:MOV A,Rn,其指令码为: 其中,高5位表示操作内容——传送,最低三位rrr的不同二进制编码用来表示从哪一个寄 存器取数。 2.二字节指令。 二字节指令中的第一个字表尔操作码,第二个字节表示操作数,这里的操作数既可能是立即数,也可能是地址。其指令格式为: 3.三字节指令 三节节指令中,第一字节表示操作码,另两个字节是操作数,其指令格式为

绝大多数指令执行时都需要使用操作数,因此如何寻找存放操作数的单元地址和提取操作数就变得十分重要。Atmel代理所谓寻址方式就是如何找到存放操作数的地址,把操作数提取出来 的方法。 寻址方式与计算机的存储器空间结构有关,寻址方式越多,则计算机的功能越强,灵活性也越大,能更有效地处理各种数据,但指令系统也会相应的复杂。 MCS-51单片机共有七种寻址方式。下面分别加以介绍。 1.寄存器寻址 寄存器寻址是将所选定的工作寄存器组中的8个工作寄存器(R0—R7)的内容作为操 作数。指令操作码的低三位的不同组合分别代表R0—R7中的某一个。A、B、DPTR和C(位累加器)也能作为寄存器来寻址。例如: 这里源操作数和目标操作数均采用寄存器寻址.寄存器中的内容为操作数。 2.直接寻址 在直接寻址方式中、操作数由指令中的一个8位地址单元所指定。只有内部RAM中的00H~7FH地址单元和80H~FFH地址中的专用寄存器可直接寻址,且直接寻址是访问专 用寄存器的唯一方法。 采用直接寻址方式的指令是双字节指令,第一个字节是操作码,第二个字节是内部RAM的低128字节或专用寄存器的地址。例如: 此例中,源操作数采用直接寻址方式,表示把内部RAM中30H单元的内容送入A。指令代码为E5H、30H。 3.寄存器间接寻址 在寄存器间接寻址方式个,指令中给出的杏存器的内容为操作数的地址,而不是操作数本身。内部RAM和外部RAM都可以间接寻址。 当访问内部RAM或外部RAM的低256字节时,间址寄存器可以是选中寄存器组中的R0或R1,即内R0或R1间接给出操作数所在的地址‘ 当访问外部RAM时,16位间址寄存器只能使用16位数据指针寄存器DPTR,这时可对整个外部RAM空间(64KB)寻址。 PUSH和POP指令的执行也采用寄存器间接寻址,这时堆栈指针SP用作间址寄存 器。堆栈指针可驻留在内部RAM的任何地方;例如:

指令与寻址方式习题

指令与寻址方式习题解答 1.试分别说明下列各指令中源操作数和目的操作数使用的寻址方式:(1)AND AX,0FFH (2)AND BL,[OFFH] (3)MOV DS,AX (4)CMP [SI],CX (5)MOV DS:[0FFH],CL (6)SUB [BP][SI],AH (7)ADC AX,0ABH[BX] (8)OR DX,-35[BX][DI] (9)PUSH DS (10)CMC 答:目的操作数源操作数 (1)寄存器直接寻址立即数寻址 (2)寄存器直接寻址直接寻址 (3)寄存器直接寻址寄存器直接寻址 (4)寄存器间接寻址寄存器直接寻址 (5)直接寻址寄存器直接寻址 (6)基址变址寻址寄存器直接寻址 (7)寄存器直接寻址寄存器相对寻址 (8)寄存器直接寻址基址变址相对寻址 (9)无寄存器直接寻址 (10)隐含寻址 2.试分别指出下列各指令语句的语法是否有错,如有错,指明是什么错误。 (1)MOV [BX][BP],AX (2)TEST [BP],BL (3)ADD SI,ABH (4)AND DH,DL (5)CMP CL,1234H (6)SHR [BX][DI],3 (7)NOT CX,AX (8)LEA DS,35[SI] (9)INC CX,1 (10)P USH 45[DI] 答:(1)应将BP,BX其中之一该为SI或DI (2)正确 (3)ABH改为0ABH (4) (5)是字操作,CL改为CX (6)移位数大于1时,应用CL (7)NOT指令只有一个操作数 (8)LEA指令的源操作数应为一内存单元地址

(9)此指令不用指出1 (10)45改为45H 3.下面两条指令执行后,标志寄存器中CF,AF,ZF,SF和OF分别是什么状态? MOV DL,86 ADD DL,0AAH 答: 0101,0110 + 1010,1010 = 1,0000,0000 CF=1 AF=1 ZF=1 SF=1 OF=1 4.在8086/8088CPU中可用于作地址指针的寄存器有哪些? 答:有BX,CX,DX,BP,SI,DI (IP,SP,) 5.已知(DS)=09lDH,(SS)=1E4AH,(AX)=1234H,(BX)=0024H,(CX)=5678H,(BP)=0024H,(SI)=0012H,(DI)=0032H,(09226H)=00F6H,(09228H)=1E40H,(1E4F6H)=091DH。下列各指令或程序段分别执行后的结果如何? (1)MOV CL,20H[BX][SI] (2)MOV [BP][DI],CX (3)LEA BX,20H[BX][SI] MOV AX,2[BX] (4)LDS SI,[BX][DI] MOV [SI],BX (5)XCHG CX,32H[BX] XCHG 20H[BX][SI],AX 答(1) (CX)=56F6H; (2) (09226H)=5678H; (3) (AX)=1E40H; (4) (1E4F6H)=0024H; (5) (09226H)=1234H,(AX)=5678H. 6.已知(SS)=09l 5H,(DS)=0930H,(SI)=0A0H,(DI)=1C0H,(BX)=80H,(BP)=470H。现有一指令“MOV AX,OPRD”,如源操作数的物理地址为095C0H,试用四种不同寻址方式改写此指令(要求上述每个已知条件至少要使用一次)。 答:(1)MOV AX,[BP] (2)MOV AX,[BP+DI+80H] (3)MOV AX,[DI+0100H] MOV AX,[SI+0220H] (4)MOV AX,[02C0H] 7.试按下列要求分别编制程序段: (1)把标志寄存器中符号位SF置‘1’。 (2)寄存器AL中高低四位互换。 (3)由寄存器AX,BX组成一个32位带符号数(AX中存放高十六位),试求这个数的负数。 (4)现有三个字节存储单元A,B,C。在不使用ADD和ADC指令的情况下,实现(A)+(B)=>C。 (5)用一条指令把CX中的整数转变为奇数(如原来已是奇数,则CX中数据不变,如原来是偶数,则(CX)+1形成奇数)。 答:(1)MOV AH, 80H SAHF

MCS-51单片机的寻址方式和指令系统

MCS-51单片机指令系统与汇编语言程序设计 伪指令............................................. (2) MCS-51单片机的寻址方式 (4) MCS-51单片机的指令系统 (7) 数据传送指令 (8) 算数运算指令 (10) 逻辑运算及移位指令 (12) 控制转移指令 (13) 位操作指令 (18)

指令格式:指令的表示方式称为指令格式,它规定了指令的长度和内部信息的安排。完整的指令格式如下: [标号:] 操作码 [操作数] [,操作数] [;注释] 标号: 代表指令的具体地址 操作码: 又称助记符,英文缩写 操作数: 操作数中常数可以用二、八、十、十六进制表示,如果用十六进制表示,最高位用A以上的数开头时,前面须加0,否则机器不识别 注释:增加程序的可读性 伪指令 (1)定位伪指令ORG 格式:ORG n 其中:n通常为绝对地址,可以是十六进制数、标号或表达式。 功能:规定编译后的机器代码存放的起始位置。在一个汇编语言源程序中允许存在多条定位伪指令,但每一个n值都应和前面生成的机器指令存放地址不重叠。 例如程序:ORG 1000H START:MOV A,#20H MOV B,#30H ┇ (2)结束汇编伪指令END 格式:[标号:] END [表达式] 功能:放在汇编语言源程序的末尾,表明源程序的汇编到此结束,其后的任何内容不予理睬。 (3)赋值伪指令EQU 格式:字符名称x EQU 赋值项n 功能:将赋值项n的值赋予字符名称x。程序中凡出现该字符名称x就等同于该赋值项n,其值在整个程序中有效。赋值项n可以是常数、地址、标号或表达式。在使用时,必须先赋值后使用。 “字符名称”与“标号”的区别是“字符名称”后无冒号,而“标号”后面有冒号。 (4)定义字节伪指令DB

1_寻址方式与基本指令实验

2.1 寻址方式与基本指令实验 2.1.1 实验目的 1、熟悉80x86寻址方式及基本指令的功能,进一步理解和巩固课堂学习内容。 2、掌握汇编语言程序设计上机过程, 掌握汇编语言源程序结构,为后续汇编语言程序设计打好基础。 3、熟悉Microsoft的DEBUG或Borland的Turbo DEBUG调试工具的使用方法 2.1.2 实验预习要求 1、认真阅读本书第一部分第1章,熟悉汇编语言程序设计上机步骤。 2、认真阅读本书第三部分,熟悉DEBUG调试工具的使用方法。 3、复习80x86操作数寻址方式及基本指令(数据传送、算术运算和逻辑运算等)。 4、了解实验内容,并在实验前根据课堂所学知识回答有关问题(个别取决于程序实际运行环境的问题除外),以便在实验时进行验证。 2.1.3 实验内容 1、读懂下列源程序,使用EDIT生成名为EX11.ASM的源程序,汇编生成EX11.OBJ文件和EX11.LST 文件,连接生成EX11.EXE文件;用EDIT打开EX11.LST文件,了解.LST文件包含的信息;使用DEBUG调试工具单步执行EX11.EXE程序,注意观察IP值的变化,并回答下列问题。 (1)程序装入后,代码段寄存器CS的内容为13FD________H,代码段第一条可执行指令MOV A X, DATA对应的机器代码为B8FC13__________H,它是一个_3_______字节指令,注意观察 执行该指令时IP值的变化情况,该指令源操作数DATA的寻址方式是(立即数寻址_),其值为__13FC________。 (2)执行完MOV DS, DATA指令后,数据段寄存器DS的内容为_13FC_______H,源程序在数据段中定义的数据82H、68H和88H被装入的存储单元的物理地址分别为_13FC0_______H、13FC1________H和13FC2________H。 (3)程序中第一条ADD AL, [BX] 指令对应的机器代码为_0207_________H,它是一个_2_______字节指令,注意观察执行该指令时IP值的变化情况;该指令中源操作数的寻址方式为_寄存器间接寻址_________,该操作数所在存储单元的逻辑地址(DS): (BX)为_13FC:0001_________,其物理地址为_13FC1_________H;执行完该指令后(AL)=_EA_____H,CF=_NC_____,OF=NV______,ZF=NZ______,SF=NG______,AF=NA______,PF=PO______;若两操作数为无符号数,计算结果是否正确__正确_____?若两操作数为带符号数,计算结果是否正确__正确______?若计算结果正确,结果是正数还是负数(正数)? (4)执行完第二条ADD AL, [BX] 指令后(AL)=__72____H,CF=CY______,OF=OV______,ZF=NZ______,SF=PL______,AF=AC______,PF=PE______;若两操作数为无符号数,计算结果是否正确__正确_____?若两操作数为带符号数,计算结果是否正确_不正确_______? (5)指令MOV SUM, AL中目的操作数的寻址方式为__寄存器直接寻址________。该指令执行完后,注意观察(DS):0003H单元中值的变化,该单元的值变为_00_______H。 DA TA SEGMENT NUM DB 82H, 68H, 88H SUM DB ? DA TA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DA TA

单片机的指令和寻址方式

单片机的指令和寻址方式 单片机要正常运作,事先需编制程序,再把程序放入存贮器中,然后由CPU 执行该程序。程序是由指令组成的,指令的基本组成是操作码和操作数。单片机的品种很多,设计时怎样表示操作码和操作数,都有各自的规定,再有指令代码也各不相同,因此,必须对所选单片机的全部指令,也就是所谓指令系统,有足够的了解。各个系列的单片机虽然有不同的指令系统,但也有其共同性。掌握一种单片机的指令系统,对其它系列单片机可以起到触类旁通的作用。MCS-51 单片机应用广泛,派生品种多,具有代表性,所以,这里以MCS-51 系列的指令系统为例说明指令的组成和应用。1、MOV A,#20H 这条指令表示把20H 这个数送入累加器A 中(一个特殊功能寄存器)。 2、ADD A,70H 这条指令表示把累加器A 中的内容(在上例中送入的#20H)和存贮器中 地址为70H 单元中的内容(也是一个数字),通过算术逻辑单元(英文缩写为ALU)相加,并将结果保留在A 中。这里MOV、ADD 等称为操作码,而 A、#20H、70H 等均称为操作数。在汇编语言程序中,操作码通常由英文单词缩写而成,这样有助于记忆,所以又称助记符。如MOV 就是英文单词MOVE 的缩写,含有搬移的意思;而ADD 即为英文单词,其意为相加。因此,对于 略懂英语的用户,掌握单片机指令的含意是较为方便的。操作数有多种表示法,如以上的#20H 称为立即数,即20H 就是真正的操作数。而70H 是存贮器中某个单元的地址,在该单元中,放着操作数(比如说是3AH),ADD A,70H 不是将70H 和A 中的内容相加,而是从存贮器70H 单元中将3AH 取出和A 中的内容相加。由上可知,要找到实际操作数,有时就要转个弯,甚至转几个弯,这个过程称为寻址,MCS-51 共有7 种寻址方式,现介绍如下:

MIPS基本指令和寻址方式

MIPS 基本指令和寻址方式: MIPS 是典型的RISC 处理器,采用32位定长指令字,操作码字段也是固定长度,没有专门的寻址方式字段,由指令格式确定各操作数的寻址方式。 MIPS 指令格式一般有三种格式: R-型指令格式 I-型指令格式 J-型指令格式 R _Type 指指指指 26 21 16 11 6 31 OP : 操作码 rs : 第一个源操作数寄存器 rt : 第二个源操作数寄存器(单目原数据) rd : 结果寄存器 shamt :移位指令的位移量 func : 指令的具体操作类型 特点:R-型指令是RR 型指令,其操作码OP 字段是特定的“000000”,具体操作类型由func 字段给定。例如:func=“100000”时,表示“加法”运算。 R[rd] ← R[rs] + R[rt] I _Type 指 指指指 26 21 1631 15 特点:I-型指令是立即数型指令 双目运算: R[rt] R[rs](OP )SignExt(imm16) Load 指令: Addr ← R[rs] + SignExt(imm16) 计算数据地址 (立即数要进行符号扩展) R[rt] ← M[Addr] 从存储器中取出数据,装入到寄存器中

Store 指令: Addr ← R[rs] + SignExt(imm16) M[Addr] ← R[rt] J _Type 指令格式 2631 6bit 26bit 25 特点:J-型指令主要是无条件跳转指令,将当前PC 的高4位拼上26位立即数,后补两个“0”, 作为跳转目标地址。 j L //goto L 指指指指指指指指指 jal L //$ra 指PC+4;goto L 指指指指指指指指指 R 型指令: 定点运算: add / addu , sub / subu , sra , mult/multu , div/divu 逻辑运算: and / or / nor , sll / srl 比较分支: beq / bne / slt / sltu 跳转指令: jr I 型指令: 定点运算: addi / addiu 逻辑运算: andi / ori 比较分支: slti / sltiu 数据传送: lw / sw / lhu / sh / lbu / sb / lui J 型指令: j / jal

7种寻址方式

七种寻址方式 1、(直接寻址方式) 指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。在通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。例:假设有指令:MOV BX, [1234H],在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是什么?解:根据直接寻址方式的寻址规则,把该指令的具体执行过程用下图来表示。从图中,可看出执行该指令要分三部分: 由于1234H是一个直接地址,它紧跟在指令的操作码之后,随取指令而被读出;访问数据段的段寄存器是DS,所以,用DS的值和偏移量1234H 相加,得存储单元的物理地址:21234H;取单元21234H的值5213H,并按“高高低低”的原则存入寄存器BX中。所以,在执行该指令后,BX的值就为5213H。由于数据段的段寄存器默认为DS,如果要指定访问其它段内的数据,可在指令中用段前缀的方式显式地书写出来。下面指令的目标操作数就是带有段前缀的直接寻址方式。 MOV ES:[1000H], AX 直接寻址方式常用于处理内存单元的数据,其操作数是内存变量的值,该寻址方式可在64K字节的段内进行寻址。注意:立即寻址方式和直接寻址方式的书写格式的不同,直接寻址的地址要写在括号“[”,“]”内。在程序中,直接地址通常用内存变量名来表示,如:MOV BX, VARW,其中,VARW是内存字变量。试比较下列指令中源操作数的寻址方式(VARW是内存字变量): MOV AX, 1234H MOV AX, [1234H] ;前者是立即寻址,后者是直接寻址 MOV AX, VARW MOV AX, [VARW] ;两者是等效的,均为直接寻址 2、(寄存器间接寻址方式) 操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。该寻址方式物理地址的计算方法如下:

第3章 寻址方式和指令系统作业

一、选择题 1.寄存器间接寻址方式中,要寻找的操作数位于( B )中。 A.通用寄存器 B.内存单元 C.段寄存器 D.堆栈 2.下列指令中正确的是( C )。 A.MOV AL,BX B.MOV CS,AX C.MOV AL,CL D.MOV [BX],[SI] 3.下列指令中错误的是( C )。 A.MOV AX,1234H B.INC BX C.SRL AX,2 D.PUSH DX 4.设(SP)=1010H,执行POP AX后,SP中的内容为( B )。 A.1011H B.1012H C.1OOEH D.100FH 5.给定(AL)=80H,(CL)=02H,指令SHR AL,CL执行后的结果是(B )。 A.(AL)=40H B.(AL)=20H C.(AL)=C0H D.(AL)=E0H 6.将AX清零并使CF位清零,下面指令错误的是( A )。 A.SUB AX,BX B.XOR AX,AX C.MOV AX,0 D.AND AX,0OOOH 二、填空题 2.寻址的含义是指_寻找操作数的过程_;8086指令系统的寻址方式按照大类可分为_与操作数有关的寻址方式、与I/O端口有关的寻址方式_;其中寻址速度最快的是_立即数寻址_。 4.堆栈是一个特殊的_存储器区域_,其操作是以_2字节单元_为单位按照__先进后出_原则来处理;采用_SP_指向栈顶地址,入栈时地址变化为_SP<=(SP)-2_。 5.I/O端口的寻址有_直接端口寻址和间接端口寻址_两种方式;采用8位数时,可访问的端口地址为_0~255_;采用16位数时,可访问的端口地址为_0~65535_。 三、分析计算题 1.指出如下指令中源操作数和目的操作数的寻址方式: (1)MOV AX,100H (2)MOV CX,AX (3)ADD [SI],1000 (4)SUB BX,[SI+100] (5)MOV [BX+300],AX (6)AND BP,[DI] 解: 源操作数的寻址方式目的操作数的寻址方式 (1)MOV AX,100H 立即数寄存器 (2)MOV CX,AX 寄存器寄存器 (3)ADD [SI],1000 立即数寄存器间接 (4)SUB BX,[SI+100] 变址寄存器 (5)MOV [BX+300],AX 寄存器变址 (6)AND BP,[DI] 寄存器间接寄存器 2.分析如下指令的正误,对错误指令说明出错误原因并加以收正: (1)MOV [1200],23H (2)MOV 1020H,CX (3)MOV [1000H],[2000H] (4)MOV IP,O00H

第四章 指令与寻址方式习题解答 (2)

1. 假定(BX)=637DH,(SI)=2A9BH,位移量D=3237H,试确定在以下各种寻址方式下的有效地址是什么? (1)立即寻址 (2)直接寻址 (3)使用BX的寄存器寻址 (4)使用BX的间接寻址 (5)使用BX的寄存器相对寻址 (6)基址变址寻址 (7)相对基址变址寻址 答:(1)立即数寻址的有效地址是当前IP的内容; (2)直接寻址,若使用位移量D=3237H进行,则有效地址为3237H; (3)使用BX的寄存器寻址时,操作数在BX寄存器中,因此无有效地址; (4)使用BX的间接寻址时,有效地址在BX寄存器中,即有效地址=637DH; (5)使用BX的寄存器相对寻址的有效地址=(BX)+D=637DH+3237H=95B4H; (6)基址变址寻址的有效地址=(BX)+(SI)=637DH+2A9BH=8E18H; (7)相对基址变址寻址的有效地址=(BX)+(SI)+D=C050H; 2. 写出把首地址为BLOCK的字数组的第6个字送到DX寄存器的指令。要求使用以下几种寻址方式: (1)寄存器间接寻址 (2)寄存器相对寻址 (3)基址变址寻址 答:(1)使用寄存器间接寻址,把首地址为BLOCK的字数组的第6个字送到DX寄存器的指令为: MOV BX,BLOCK ADD BX,12 MOV DX,[BX] (2)使用寄存器相对寻址,把首地址为BLOCK的字数组的第6个字送到DX寄存器的指令为: MOV BX,BLOCK MOV DX,[BX+12] (3)使用基址变址寻址,把首地址为BLOCK的字数组的第6个字送到DX寄存器的指令为: MOV BX,BLOCK MOV SI,12 MOV DX,[BX+SI] 3. 现有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100H)=12H,(20101H)=34H,(20102H)=56H,(20103H)=78H,(21200H)=2AH,(21201H)=4CH,(21202H)=B7H,(21203H)=65H,试说明下列各条指令执行完后AX寄存器的内容。 (1)MOV AX,1200H

单片机实验-寻址方式和指令系统实验指导书

实验6. 寻址方式和指令系统 一.实验目的 1.了解MSP430G2xxx汇编格式指令和常用寻址方式 2.了解C语言函数调用过程 3.通过反汇编了解C编译器实现初始化变量的方法 4.掌握计算机中数的表示和编码 二. 实验任务 1.汇编格式指令和寻址方式的学习(可在simulator下完成) L6_1.c源程序见下,建立C项目,进入DEBUG状态,点击view/disassembly,在反汇编窗口得到L6_1.c汇编格式指令的程序代码,如图6-1和图6-2,阅读该程序的汇编格式代码,思考: 1) 程序用到了哪些指令? 2) 程序用到了哪几种寻址方式? 3)用单步执行命令F11,跟踪函数delay的调用和返回,用view/register和view/ memory查看堆栈指针SP和堆栈内的内容,记录堆栈指针SP和堆栈内容的变化; 4) 修改l6_1.C,将变量i定义为全局变量,通过反汇编的代码,比较与定义为局部变 量的不同; 5) 修改L6_1.C, 将变量i的类型从 unsigned int 类型,改为unsigned long 类型, 反汇编看看函数delay的代码发生了什么变化?程序执行的结果有什么不同?为什么?(需在实验板上运行)。 L66__1.c程序清单(提供电子版)

图6-1 L6-1.c程序中main函数的反汇编代码 图6-2 L6_1.c程序中delay函数的反汇编代码 2. 了解C语言程序的执行过程(可在simulator 方式下完成) 指令计数寄存器PC决定CPU取指令的地址,所以PC寄存器的内容决定了程序的流程。已知MSP430G2xxx单片机复位后, PC寄存器从存储器0xFFFE~0xFFFFH单元获取一个字内容作为执行第一条指令的地址。以L4_1.C的项目为例,请问实验中查看到该地址的值是多少?程序执行的第一条指令是什么指令?main函数的入口是单片机上电就被执行的第一条语句吗? 说明:如图6-3,可在项目设置option/Debugger/set up中,去除对run to前的选项,再将程序下载到单片机中,观察当前上电复位PC的值与0xFFFE~0xFFFF存储单元内容的关系,对比不去除run to前的选项的不同。 图6-3 C语言程序下载后程序运行的停止处设置(注意Run to 的选项)

指令格式和寻址方式

“指令格式和寻址方式”实验报告 姓名:朱蕾 学号:1107830133 以对源文件EXAMPLE 。EXE 进行操作为例 1 连接并生成扩展名为.EXE 可执行文件的操作 2 对可执行文件进行调试的操作: 3 用反汇编命令“U 代码段地址:起始偏移地址”显示出程序的表示符 程序的起始地址是0BB9H :001BH 4程序的起始地址是 0BB9H :001BH 进入C 盘根目录 13C4为段地址 第二列是代码段地址;第 三列是段内偏移地址 基址变址寻址:基址 寄存器的代码BX,变址寄存器的代码SI.

5 --D DS :0000;功能:显示内存中的数据命令 格式:D 数据段地址:存放数据的偏移地址 6-G=CS :0000 001B ; 功能:连续执行程序命令 格式:代码段地址:指令的起始偏移地址 指令的结 束偏移地址 7 –D DS :0000;功能:显示内存中的数据命令 格式:数据段地址:存放数据的偏移地 8 –R IP 指令的结束移地址 指令的起始偏移地址 立即寻址:CPU 直接将内存中的立即数4C00寄存在AX 中。 显示修改前得数据 输入修 改得数据

9 -T 单步执行程序命令(执行一条指令) 10 -T3 执行3条指令 11 -R 查看寄存器的数据命令 12 -R AX 查看和修改寄存器的数据命令 13 -D DS:0000 观察内存中的数据 14 -F DS:0000 0030 DF;对内存单元填充数据 -D DS:0000;观察内存中的是数据 显示修改后的数据。 寄存器直接寻址:将AX 的值赋给DS. 此三条指令均为寄存器直接寻址 AX 寄存器的数据命令变为FFFF,其他保持不变 第一列为数据段地址,第二列为偏移首地址,第三列为偏移末地址,第四列为填充的数据。

相关主题
文本预览
相关文档 最新文档