【转载】机器指令计算机

本文介绍了计算机的几种寻址方式,包括立即数寻址、寄存器寻址、寄存器间接寻址等,并通过具体例子解析了它们在实际指令中的应用。同时,文章指出了常见错误,如不能直接向DS寄存器送立即数,立即数不能用于交换指令等,并提供了解决方案。此外,还涉及到了内存清零、字符串复制等操作的实现细节。
摘要由CSDN通过智能技术生成

微型计算机原理(第六版)姚向华编著(转载请注明出处—https://www.cnblogs.com/qingl)

第三章P118

  1. 指出下列指令中源操作数和目的操作数的寻址方式:
    
                                                                   源操作数                            目的操作数
    

(1)MOV SI,1000 立即数寻址 寄存器寻址

(3)MOV [SI],1000 立即数寻址 寄存器间接寻址

(5)AND DL,[BX + SI + 20H] 相对的基址加变址寻址     寄存器寻址

(7)POP AX 寄存器寻址 寄存器寻址

(8)MOV EAX,COUNT[EDX*4]   寄存器相对寻址  直接寻址

  1. 指出下列指令语法是否正确,若不正确请说明原因。
    

(01)MOV DS,0100H

(02)MOV BP,AL

(03)XCHG AX,2000H

(04)OUT 310H,AL

(07)MOV AX,[SI + DI]

(09)AND AX,BL

(11)MOV [BX],[SI]

(12)MOV CS,[1000]

解:

01)不能直接向DS中送立即数。改为:MOV AX,0100H

MOV DS,AX

02)源操作数和目的操作数的类型不同。改为:MOV BP,AX

03)立即数不能用于交换指令

04)直接寻址的输出指令中,端口号只能在O~FFH范围内

07)SI、DI不能一起用。改为:MOV AX,[BX + DI]

09)源操作数和目的操作数的类型不同。改为:AND AX,BX

11)MOV指令不能源操作数和目的操作数都是寄存器。改为:MOV BX,[SI];源操作数为寄存器,目的操作数是存储器。或MOV [BX],SI;源操作数为存储器,目的操作数是寄存器。

12)MOV的操作数不能是CS

  1. 执行下列程序段,指出此程序段功能。
    

(1)MOV CX,10;

    LEA SI,First;//将数据段First的地址偏移量送SI

    LEA DI,Second;//将数据段Secnd的地址偏移量送DI

    REP MOVSB;//将源串一字节传送到目地串,并自动修改指针值

功能:将源字符串First的10个字节移送至目标字符串Second

(2)CLD;

LEA DI,ES:[0404H];

MOV CX,0080H;

XOR AX,AX;

REP STOSW;

功能:将内存中从0404H单元开始的128个字单元清零

另:1° 分别填写下列操作数的寻址方式和物理地址

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

(1)MOV AX,OABH

(2)MOV AX,[100H]

(3)MOV AX,ES:[BX]

(4)MOV AX,VAL[BX]

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

解:

1) 立即寻址, 没有物理地址

2) 直接寻址, 物理地址= 10 × 段地址(DS)+ 偏移量(EA)

= 10 × 2000H + 100H = 20100H

3)寄存器间接寻址, 物理地址 = 10 × 段地址(ES)+ 偏移量(EA)

                                              = 10 × 2100H + 0100H = 21100H

4)寄存器相对寻址, 物理地址= 10 × 段地址(DS)+ 偏移量(EA)

                                      = 10 × 2000H + 0050H = 20150H

5)基址变址寻址, 物理地址 = 10 × 段地址(DS)+ 偏移量(EA)

                                              =10 × 2000H + 0100H + 00A0H = 201A0H

2°分别填写下列操作数的值

已知DS= 091DH,AX= 1234H,BX= 0024H,CX= 5678H,SI= 0012H,DI= 0032H,(09226H)= 00F6H,(09228H)= 1E40H,(1E4F6H)= 091DH,试求单独执行下列指令后的结果。

1) MOV CL,20H[BX][SI]; (CL)= 00F6H

2) LEA BX,20H[BX][SI]; (BX)= 0056H

3) LDS SI,[BX][DI]; [SI] = 00F6H

4) MOV [SI],BX; [SI] = 0024H

5) XCHG CX,32H[BX]; (CX) = 00F6H

第四章P195

  1. 设下列指令语句中的标识符均为字变量,请指出哪些指令是非法的,并指出其错误之处。.
    

(02)MOV AX,WORD1[DX] DX不能作为基址寄存器

(03)MOV WORD1,WORD2 源操作数和目的操作数不能均在存储器

(04)MOV SWORD,DS √

(07)MOV AX,WORD1+WORD2 两个变量不能直接相加

(10)MOV SI,OFFSET WORD2[BX] OFFSET后应跟变量或标号

  1. 试编制一程序,统计出某数组中相邻两数之间符号变化的次数。
    

DATA SEGMENT

N = 20H

       ARRAY DB 20 DUP(?)

       NUM DB 0

        DATA ENDS

 CODE SEGMENT

         ASSUME CS:CODE,DS:DATA

 STARTUP:LEA SI,ARRAY;SI指向数组首址

MOV AL,[SI] ;取第一个字符

       MOV      BL,0    ;结果计数器清零

       MOV      CX,19    ;置循环计数器

AGAIN:  INC    SI    ;指向下一数组单元

       XOR       AL,[SI]    ;两个数按位进行逻辑异或操作

       JNS         NEXT    ;符号位非负表明两数符号相同,跳过不计数

       INC         BL    ;结果计数器BL加1

NEXT:   MOV      AL,[SI]    ;当前数组元素送AL

       LOOP     AGAIN

       MOV      NUM,BL  ;保存结果

       MOV      AH,4CH    ;返回DOS

       INT  21H

CODE ENDS

END START
  1. 试编制一程序,把20个字节的数组分成正数组和负数组,并分别计算两个数组中数据的个数。

解:程序如下:

DATA SEGMENT

BUF DB 12H,34H, 56H,……

N=20

BUF1 DB N DUP(0),0

BUF2 DB N DUP(?),0

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV DX,DATA

MOV DS,DX

       LEA   SI,BUF

LEA DI,BUF1

LEA BX,BUF2

MOV CX,N

LOP: MOV AL,[SI]

INC SI

CMP AL,O

JGE PLUS

MOV [BX],AL

INC BUF2+N

INC BX

JMP NEXT

PLUS:MOV [DI],AL

INC BUF1+N

INC DI

NEXT:LOOP LOP

      MOV   AH,4CH

INT 21H

CODE ENDS

END START

微型计算机原理(第六版)姚向华编著(转载请注明出处—https://www.cnblogs.com/qingl)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值