第34578章作业答案.docx
- 文档编号:15684082
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:30
- 大小:74.41KB
第34578章作业答案.docx
《第34578章作业答案.docx》由会员分享,可在线阅读,更多相关《第34578章作业答案.docx(30页珍藏版)》请在冰点文库上搜索。
第34578章作业答案
第3章指令系统
3.9设段寄存器DS=1000H,SS=2000H,ES=3000H,通用寄存器BX=4000H,BP=5000H,SI=6000H,DI=7000H。
在下列各指令中指出存储器操作数的寻址方式,求出有效地址EA、物理地址PA,并分别用物理地址和逻辑地址说明指令执行结果。
(1)MOVCX,[2300H]
直接寻址
EA=2300H
PA=DS*16+EA=1000H*16+2300H=12300H
执行结果:
(12300H)→CL,(12301H)→CH
(2)MOVBYTEPTR[BX],8FH
寄存器间接寻址
EA=BX=4000H
PA=DS*16+EA=1000H*16+4000H=14000H
执行结果:
8FH→(14000H)
(3)MOVDH,[BP+3000H]
基址寻址
EA=BP+3000H=8000H
PA=SS*16+EA=2000H*16+8000H=28000H
执行结果:
(28000H)→DH
(4)MOVES:
[SI+1210H],AX
变址寻址
EA=SI+1210H=7210H
PA=ES*16+EA=3000H*16+7210H=37210H
执行结果:
AL→(37210H),AH→(37211H)
(5)MOV[BX+DI+50H],AL
基址变址位移寻址
EA=BX+DI+50H=0B050H
PA=DS*16+EA=1000H*16+0B050H=1B050H
执行结果:
AL→(1B050H)
(6)INCWORDPTR[BX+SI]
基址变址寻址
EA=BX+SI=0A000H
PA=DS*16+EA=1000H*16+0A000H=1A000H
执行结果:
(1A000H)中存放的字的值加1
3.11指出下列指令中源操作数的寻址方式。
(1)MOVBL,0F9H立即寻址
(2)ADD[BX],SI寄存器寻址
(3)SUBCL,[4000H]直接寻址
(4)CMPDX,[SI]寄存器间接寻址
(5)ANDSL,[BX+1]基址寻址
(6)ORBP,[DI+2100H]变址寻址
(7)XORAX,[BP+SI]基址变址寻址
(8)MOVCX,300立即寻址
3.12下列指令都是非法的,指出各指令错在哪里?
(1)MOVSI,AH
两个操作数字长不一致
(2)MOV70H,BL
立即数不能做目的操作数
(3)MOVCX,F123H
十六进制的数以字母打头必须在前面补0
(4)MOV[BX],6AH
两个操作数的字长不确定
(5)MOVES,5000H
立即数不能直接送段寄存器
(6)MOV[DI],[3000H]
两个操作数不能同为内存操作数
(7)MOVDS,SS
两个操作数不能同为段寄存器
(8)MOVCS,AX
不能对CS赋值
(9)MOVAL,[CX]
寄存器间接寻址中不能使用CX
(10)MOV[BX+BP],DX
存储器寻址方式中表示有效地址不能同为两个基址寄存器
(11)MOVBH,[SI+DI+2]
存储器寻址方式中表示有效地址不能同为两个变址寄存器
(12)PUSHAL
入栈出栈操作必须以字为单位
(13)LEAAX,BX
LEA指令中源操作数必须为存储器寻址方式
(14)LDSBL,[5100H]
LDS指令中目的操作数必须为16位的通用寄存器
(15)INAH,DX
IN指令中目的操作数必须为AL或AX
(16)OUT288H,AL
输入输出指令中端口地址为16位,必须先送给DX
(17)ADD[2400H],1234H
两个操作数的字长不确定
(18)XOR[2500H],[BX+10H]
两个操作数不能同为内存操作数
(19)INC[SI]
操作数的字长不确定
(20)MUL10
MUL指令的操作数不能为立即数
(21)IDIV[BP+DI+1300H]
操作数的字长不确定
(22)SALAL,2
移位次数大于1必须先送给CL
3.14设SP=2000H,AX=3000H,BX=5000H,执行以下3条指令后,问SP=?
AX=?
BX=?
PUSHAX;SP减2,栈顶元素为3000H
PUSHBX;SP减2,栈顶元素为5000H
POPAX;SP加2,将栈顶元素5000H弹出至AX
结果:
SP=1FFEH,AX=5000H,BX=5000H
3.16下列程序执行完后,AX=?
BX=?
CX=?
MOVAX,1122H
MOVBX,3344H
PUSHAX;栈顶元素为1122H
POPCX;将栈顶元素1122H弹出至CX
XCHGBX,CX;BX=1122H,CX=3344H
LEACX,[BX];CX=BX=1122H
结果:
AX=1122H,BX=1122H,CX=1122H
3.17CPU分别执行下列各程序段后,写出各个执行结果的状态标志位OF、SF、ZF、AF、PF、CF的值。
(1)MOVAL,7AH
ADDAL,53H
7AH+53H=CDH=11001101B
结果:
OF=1,SF=1,ZF=0,AF=0,PF=0,CF=0
(2)MOVBL,0AFH
ADDBL,0EAH
AFH+EAH=
(1)99H=10011001B
结果:
OF=0,SF=1,ZF=0,AF=1,PF=1,CF=1
(3)MOVCL,0FFH
ADDCL,01H
FFH+01H=
(1)00H=00000000B
结果:
OF=0,SF=0,ZF=1,AF=1,PF=1,CF=1
(4)MOVDL,49H
SUBDL,0CAH
49H-CAH=
(1)7FH=01111111B
结果:
OF=0,SF=0,ZF=0,AF=1,PF=0,CF=1
3.24分别写出CPU执行下面两段程序后,寄存器DX=?
AX=?
(1)MOVAL,7FH
CBW
CWD
AL=7FH=01111111B
结果:
AX=007FH,DX=0000H
(2)MOVAL,80H
CBW
CWD
AL=80H=10000000B
结果:
AX=0FF80H,DX=0FFFFH
3.25分别写出CPU执行下面两段程序后,寄存器AL=?
标志CF=?
(1)MOVAL,36H
ADDAL,58H
DAA
36H+58H=8EH,低4位大于9,故修正:
AL=8EH+6H=94H,CF=0
(2)MOVAL,49H
ADDAL,87H
DAA
49H+87H=D0H,AF=1,高4位大于9,故修正:
AL=D0H+66H=
(1)36H,CF=1
3.27分别写出CPU执行下面两段程序后,寄存器AX=?
标志CF=?
(1)MOVAX,0138H
ADDAL,35H
AAA
38H+35H=6DH,低4位大于9,故修正:
AH=AH+1=01H+1=02H
AL=(AL+6H)AND0FH=73HAND0FH=03H
AX=0203H,CF=1
(2)MOVAX,0533H
ADDAL,34H
AAA
33H+34H=67H,低4位小于9且AF=0,故修正:
AL=ALAND0FH=67HAND0FH=07H
AX=0507H,CF=0
3.28下列程序执行完后,AX=?
CF=?
MOVAX,3649H
ADDAL,AH;AL=36H+49H=7FH
DAA;AL=AL+6H=85H,CF=0
CBW;AH=0FFH,AL=85H,CF=0
INCAH;AH=00H,CF=0
ADCAL,17H;AL=AL+17H+CF=9CH,CF=0
AAA;AL=(AL+6H)AND0FH=02H,AH=AH+1=01H,CF=1
结果:
AX=0102H,CF=1
3.29有如下程序段
MOVAL,45H
ADDAL,71H;AL=45H+71H=0B6H,CF=0
DAA;AL=AL+60H=16H,CF=1
MOVBL,AL;BL=16H
ADCAL,19H;AL=16H+19H+1=30H,AF=1
DAA;AL=AL+6H=36H=00110110,CF=0,PF=1
MOVBH,AL;BH=36H
问,执行完此程序段后,BX=?
,标志位PF=?
,CF=?
结果:
BX=3616H,PF=1,CF=0
3.30分别只使用一条指令实现下述功能。
(1)使AL的低4位清0,高4位不变;
ANDAL,0F0H
(2)使DI的高10位清0,低6位不变;
ANDDI,3FH
(3)使BL的低4位置1,高4位不变;
ORBL,0FH
(4)使SI的高2位置1,低14位不变;
ORSI,0C000H
(5)使CL的D2、D3、D4、D5、D6位取反,D0、D1、D7位不变;
XORCL,7CH
(6)使BP的高4位取反,低12位不变;
XORBP,0F000H
3.32写出用一条指令使AX清0的一些指令。
MOVAX,0
SUBAX,AX
ANDAX,0
XORAX,AX
3.34用最少的指令实现下述功能。
(1)使AL的低4位移到高4位,低4位清0;
MOVCL,4
SHLAL,CL(或SALAL,CL)
(2)使AH的高4位移到低4位,高4位清0。
MOVCL,4
SHRAH,CL
3.37编程实现如下功能。
(1)将AL的低6位移到高6位,高2位移到低2位;
MOVCL,2
ROLAL,CL
(2)将BL的高6位移到低6位,低2位移到高2位;
MOVCL,2
RORBL,CL
(3)将BH的高4位与低4位交换;
MOVCL,4
ROLBH,CL(或RORBH,CL)
(4)将BP的高8位与低8位交换。
MOVCL,8
ROLBP,CL(或RORBP,CL)
3.39设AX=1234H,CX=9602H,下列程序执行完后,AL=?
ANDAL,AH;AL=12HAND34H=10H=00010000B
SHLAL,CL;AL=01000000B=40H
ORAL,CH;AL=40HOR96H=0D6H=11010110B
SARAL,CL;AL=11110101B=0F5H
XORAL,CL;AL=0F5HXOR02H=0F7H=11110111B,CF=0
RCLAL,1;AL=11101110B=0EEH
结果:
AL=0EEH
3.52比较AX和BX中两个无符号数的大小,若AX>BX,则将SI中的高8位和低8位交换;若AX=BX,则将SI中的高7位置1;若AX 试编写程序。 CODESEGMENT ASSUMECS: CODE START: CMPAX,BX JZA1;若AX=BX,转移到A1 JBA2;若AX MOVCL,8;交换SI中高8位和低8位 ROLSI,CL JMPNEXT A1: ORSI,0FE00H;将SI中的高7位置1 JMPNEXT A2: MOVCX,2;将SI中的带符号数除以2 MOVAX,SI;将被除数送给DX: AX CWD IDIVCX MOVSI,AX;将所求结果送回SI NEXT: MOVAH,4CH INT21H CODEENDS ENDSTART 3.53在以DS: 3301H为首地址的存储单元中,连续存放了50个无符号的字节数据,要求在其中找出最小值,并将它放在地址为DS: 3300H的字节单元中。 试编写程序。 CODESEGMENT ASSUMECS: CODE START: MOVSI,3301H;将首地址送给SI,用SI可以间接访问数组中的元素 MOVAL,[SI];将第一个数送给AL MOVCX,49;50个数比较49次 CYCLE: INCSI;让SI指向下一个数 CMPAL,[SI] JBENEXT;AL<=[SI],则判断下一个数 MOVAL,[SI];AL>[SI],则用[SI]取代AL NEXT: LOOPCYCLE MOVDS: [3300H],AL;编译器会认为[3300H]就是3300H,故在前面加DS: MOVAH,4CH INT21H CODEENDS ENDSTART 3.58编写将内存以ES: 1000H开始的256个字节单元清零的程序。 CODESEGMENT ASSUMECS: CODE START: MOVSI,1000H MOVCX,256 CYCLE: MOVES: [SI],BYTEPTR0 INCSI LOOPCYCLE MOVAH,4CH INT21H CODEENDS ENDSTART 用串操作指令实现: CODESEGMENT ASSUMECS: CODE START: MOVDI,1000H;给目的串首地址赋初值 MOVAL,0;用0来初始化 MOVCX,256;循环256次 CLD;地址从小到大变化 REPSTOSB;用AL中的值对指定的目的串初始化 MOVAH,4CH INT21H CODEENDS ENDSTART 3.59试编写程序,统计以DS: 8000H为起始地址的连续200个字节单元中的0的个数。 CODESEGMENT ASSUMECS: CODE START: MOVAX,0;用AX统计0的个数 MOVCX,200;循环200次 MOVSI,8000H;通过SI间接访问内存DS: 8000H开始的存储单元 CYCLE: CMPBYTEPTR[SI],0 JNZNEXT INCAX NEXT: INCSI LOOPCYCLE MOVAH,4CH INT21H CODEENDS ENDSTART 3.52比较AX和BX中两个无符号数的大小,若AX>BX,则将SI中的高8位和低8位交换;若AX=BX,则将SI中的高7位置1;若AX 试编写程序。 CODESEGMENT ASSUMECS: CODE START: CMPAX,BX JZA1;若AX=BX,转移到A1 JBA2;若AX MOVCL,8;交换SI中高8位和低8位 ROLSI,CL JMPNEXT A1: ORSI,0FE00H;将SI中的高7位置1 JMPNEXT A2: MOVCX,2;将SI中的带符号数除以2 MOVAX,SI;将被除数送给DX: AX CWD IDIVCX MOVSI,AX;将所求结果送回SI NEXT: MOVAH,4CH INT21H CODEENDS ENDSTART 3.53在以DS: 3301H为首地址的存储单元中,连续存放了50个无符号的字节数据,要求在其中找出最小值,并将它放在地址为DS: 3300H的字节单元中。 试编写程序。 CODESEGMENT ASSUMECS: CODE START: MOVSI,3301H;将首地址送给SI,用SI可以间接访问数组中的元素 MOVAL,[SI];将第一个数送给AL MOVCX,49;50个数比较49次 CYCLE: INCSI;让SI指向下一个数 CMPAL,[SI] JBENEXT;AL<=[SI],则判断下一个数 MOVAL,[SI];AL>[SI],则用[SI]取代AL NEXT: LOOPCYCLE MOVDS: [3300H],AL;编译器会认为[3300H]就是3300H,故在前面加DS: MOVAH,4CH INT21H CODEENDS ENDSTART 3.58编写将内存以ES: 1000H开始的256个字节单元清零的程序。 CODESEGMENT ASSUMECS: CODE START: MOVSI,1000H MOVCX,256 CYCLE: MOVES: [SI],BYTEPTR0 INCSI LOOPCYCLE MOVAH,4CH INT21H CODEENDS ENDSTART 用串操作指令实现: CODESEGMENT ASSUMECS: CODE START: MOVDI,1000H;给目的串首地址赋初值 MOVAL,0;用0来初始化 MOVCX,256;循环256次 CLD;地址从小到大变化 REPSTOSB;用AL中的值对指定的目的串初始化 MOVAH,4CH INT21H CODEENDS ENDSTART 3.59试编写程序,统计以DS: 8000H为起始地址的连续200个字节单元中的0的个数。 CODESEGMENT ASSUMECS: CODE START: MOVAX,0;用AX统计0的个数 MOVCX,200;循环200次 MOVSI,8000H;通过SI间接访问内存DS: 8000H开始的存储单元 CYCLE: CMPBYTEPTR[SI],0 JNZNEXT INCAX NEXT: INCSI LOOPCYCLE MOVAH,4CH INT21H CODEENDS ENDSTART 4.5程序中数据定义如下: DATA1DW? DATA2DB32DUP(? ) DATA3DD? DLENGTHEQU$-DATA1 试问DLENGTH的值是多少? DLENGTH=38 4.6在某程序中需要为一个变量BUF预留500个字节的存储空间,请写出相应的指令,如果要预留500个字的存储空间呢? BUFDB500DUP(? ) BUFDW500DUP(? ) 4.7程序中数据定义如下: BUFFERBDB‘ABCDEF’ RESULTDB? BUFFERWDW30DUP(? ) 写出以下指令的执行结果: MOVAX,TYPERESULT;AX=1 MOVBX,TYPEBUFFERW;BX=2 MOVCX,LENGTHBUFFERB;CX=1 MOVDX,LENGTHBUFFERW;DX=30 MOVAX,SIZERESULT;AX=1 MOVBX,SIZEBUFFERW;BX=60 4.11设BX=1103H,则执行下列指令后AX和CX各为多少? 若BX=03H,则结果又如何? MOVAX,BXAND0FFH MOVCX,BXEQ1103H BX=1103H AX=0003H,CX=0FFFFH BX=03H AX=0003H,CX=0 4.13两个ASCII码数串定义如下: STR1DB‘352678’ STR2DB‘123400’ 编写程序段,计算STR1+STR2,要求结果仍然是ASCII码串。 DATASEGMENT STR1DB'352678' STR2DB'123400' STRDB6DUP(? ) DATAENDS CODESEGMENT ASSUMECS: CODE,DS: DATA START: MOVAX,DATA MOVDS,AX LEASI,STR1+5;SI指向STR1的最后一个元素 LEADI,STR2+5;DI指向STR2的最后一个元素 LEABX,STR+5;BX指向STR的最后一个元素 MOVCX,6;循环6次 CLC;初始认为最低位没有进位 CYCLE: MOVAL,[SI] MOVAH,[DI] ADCAL,AH;将对应的两个ASCII码相加 AAA;修正,仅仅取运算结果的低4位 RCRDX,1;保护进位标志 ORAL,30H;将所有的数值转换为对应的ASCII码 SHLDX,1;恢复进位标志 MOV[BX],AL;将所求的ASCII码送给STR的相应元素 DECSI;SI指向前一个数 DECDI DECBX LOOPCYCLE MOVAH,4CH INT21H CODEENDS ENDSTART 4.14下面程序段是实现从键盘输入10个一位十进制数累加。 最后累加和以非压缩BCD码形式存放在AH(高位)和AL(低位)中。 试把程序段中所空缺的指令填上。 XORBX,BX MOVCX,10 LOP: MOVAH,01H;键盘字符输入 INT21H SUBAL,30H MOVDL,AL MOVAX,BX ADDAL,DL AAA MOVBX,AX LOOPLOP 4.18将内存中某数据块的正数和负数分开,并分别将这些正数和负数送同一数据段的两个缓冲区中,并在屏幕上显示正数和负数的个数。 DATASEGMENT BUFDB12,15,-2,3,-7,-8,19,-25 N=$-BUF BUF1DBNDUP(? );存放正数 BUF2DBN
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 34578 作业 答案