第一章
1.1
CPU 分析、控制并执行指令的部件
IP 指示下一条将要执行的指令的地址
SP 保存当前栈顶地址的寄存器
状态标志 指出指令操作结果的标志,如ZF,CF等。
控制标志 控制操作的标志,只有DF,IF,TF三个。
ALU 进行算术和逻辑运算的单元
存储器 存储程序、数据等信息的的记忆装置。
物理地址 CPU发出的访问存储器的地址信息。
偏移地址 相对于段起始地址的偏移量。
段地址 是逻辑段的起始地址。
1.2下列操作可使用哪些寄存器
·存放各种运算操作的数据:AX,BX,CX,DX,SP,BP,SI,DI
(我的辅导书上没有SP,BP;why?)
·存放数据串操作时的计数值:CX
·查看程序已执行到哪条指令的地址:IP
·查看堆栈中当前正要进行入出栈的存储单元的地址:SP
·查年运算结果是否等于零:PSW的ZF
·查年程序中的数据存放段区是从哪个地址开始的:DS,ES
·查看程序中的指令存放的段区是从哪个地址开始的:CS
1.3段地址和偏移地址为1000:117A的存储单元的物理地址是什么?而1109:00EA或1025:0F2A的存储单元的物理地址又是什么:这说明了什么问题?
1000:117A物理地址为:1117A;1109:00EA的物理地址为:1117A;1025:0F2A的物理地址为:1117A.说明物理地址不变,段地址改变,偏移地址也随之变化.
1.存储器地址对应的数据(图略)
75422H(字节):9CH
75424H(字节):5DH
75422H(字):249CH
75424H(字):E65DH
第二章
2.1写出相应的汇编语言指令:
(1)以寄存器BX和SI作为基址变址寻址方式把存储器中的一个字传送到CX寄存器。
MOV CX,[BX][SI(注:寄存器寻址只能使用:BX,BP,SI,DI;且BX、BP或SI,DI不能同时使用,可能我说的不太对,请版主确认一下)
(2)以寄存器BX和偏移量value作寄存器相对寻址方式把存储器的一个字和AX相加,把结果(即和)送回那个字单元中。
ADD value[BX],AX
(3)将一个字节立即数0B6H与符号的地址为NUM的存储器字节单元内容相比较。
CMP BYTE PTR 0B6H,NUM(如果前面不加BYTE RTR,默认的也是字节比较吧?还有双字比较,应该怎么写?)
(4)测试从寄存器BP和DI、偏移量COUNT作为相对基址变址寻址方式寻址的存储器字节单元内容最高位B7的值,字节单元的内容不能改变。
TEST COUNT[BP][DI],80H
(5)将AH寄存中的高4位和低4位数据互换。
MOV CL,4
ROL(或ROR) AH,CL
(6)清除以寄存器SI间接寻址的存储器字单元,同时清除CF标志位.
XOR AX,AX ;使AX=00000000,CF=0
MOV [SI],AX
2.2设DS=1000H,BX=2865H,SI=0120H,偏移量D=47A8H,试计算下列各种寻址方式下的有效地址.
1)使用D的直接寻址 47A8H (这道指令怎么写?如何定义D的值)
2)使用BX的寄存器间接寻址 2865H
3)使用BX和D的寄存器相对寻址 700DH
4)使用BX、SI和F的相对基址变址寻址 712DH
5)使用BX、SI的基址变址寻址 2985
2.3假设DS=1000H,BX=2A80H,CX=3142H,SI=0050H,(10050H)=3BH,(10051H)=86H,(11200H)=7AH,(11101H)=64H,(12ADOH)=0A3H,每小题的括号中分别填入指令执行后的结果:
1)MOV AX,1200H ;AX=1200H
2)MOV AX,[1200H] ;AX=1200H(书上的答案是647A,但是我用DEBUG试了一下是1200,可能是因为我的PII的原因吧,希望有8088的朋友能试一下,版主,考起试来应该怎么写呀?)
3)ADD [SI],CX ;(10050H)=7DH,9100510=B7H,ZF=0,CF=0,SF=1,OF=1
4)OR BYTE PTR [BX][SI],54 ;(12AD0H)=F7,CF=0,OF=0
5)MOV 150H[BX],CH ;[12BD0H]=31,CH=31
2.4指出下列指令的错误原因
1)MOV AX,CL 两操作数的长度不一样.
2)MOV CS,AX 不能给CS赋值
3)INC BETA[BP] 书上说:没有数据类型说明,但我认为它应该自动默认为字节操作,版主再来看看吧
4)MOV ES,1850H 立即数不能直接送段寄存器
5)ADD BX,DS 段寄存器不能做为加法操作数使用
6)AND AX,[CX] 寄存器寻址只能使用BX,SI,DI,BP
2.5说明下列指令执行的操作,说明原始数据和结果数据的存储地点
贴子相关图片:
作者: 218.27.73.* 2005-9-3 09:21 回复此发言
--------------------------------------------------------------------------------
2 汇编语言程序设计课后习题答案
[原始数据](结果数据)
1)mov [2700h],cx 这条指令在我的P4试了一下,是错误的;如果考试时出只好说是:把[CX]中的内容送到(数据段中偏移地址为2700h字单元)中;
2)MOV DH,50[SI] 将[数据段中有效地址为SI+50的字节单元]中的数据送入(DH)中;
3)LEA SI,ARRAY 将ARRAY的偏移地址送入(SI),结果数据在[代码段对相应指令字节中]
4)DAS 将AL中的压缩的十六进制数调整为十进制数,结果数据在AL中,原始数据也在AL中
5)ADC CL,[BX] 将BX和CL的和加上CF的值后,存放在CL中,结果在CL中,原始在BX,CL,CF中
6)ROR WORD PTR ALPHA[SI],CL 将偏移地址为ALPHA+SI字单元中的数据循环移,结果和原始都在哪个字单元中.
2.6指出下列无条件转移指令的转移地址中的偏移地址是什么,存放在何处.
1)JMP BX 偏移地址是BX中的值,存放在BX中
2)JMP WORD PTR [BX] 偏移地址是以BX中的值为偏移地址的一个字单元中的数值,存放在以BX中的值为偏移地址的一个字单元中
3)JMP NEAR PTR PROA 偏移地址为PROA的偏移地址,存放在CS段的相应指令处(书上说的不一样,请版主做下这道题)
4)JMP FAR PTR FAR_PRO 偏移地址为FAR_PRO的偏移地址,,存放在CS段的相应指令处
5)JMP SHORT AGAIN 偏移地址为AGAIN的偏移地址,存放在CS段的相应指令处(书上说的不一样,请版主做下这道题)
6)JMP DWORD PTR [BX][DI] 偏移地址是以BX,DI为基址变址寻址的两个字单元的内容,存放在以BX,DI为基址变址寻址的两个字单元中
2.7写出把道址为BLOCK的字数组的第六个字送到CX寄器的指令序列,要发别使用以下几种寻址方式
1)以BX寄存器的间接寻址
LEA BX,BLOCK+0AH
MOV CX,[BX]
2) 以BX寄存器的相对寻址
LEA BX,BLOCK
MOV CX,0AH[BX]
3) 以BX,SI的基址变址寻址
LEA BX,BLOCK
MOV CX,[BX][SI]
2.8指出下列指令的源和目的操作数的寻址方式
(目地操作数寻址方式;原操作数寻址方式)
1)MOV ARRAY,BX
直接寻址;寄存器寻址
2)ADC CX,ALPHA[BX][SI]
寄存器寻址;相对基址变址寻址,寄存器寻址
3)AND BYTE PTR GAMMA [DI],11011001B
寄存器相对寻址;立即寻址,寄存器相对寻址
4)INC WORD PTR [BX]
寄存器间接寻址;寄存器间接寻址
5)TEST EX:[IS],DX
(目的操作数?在哪?只改变标志位,算寄存器寻址吗?书上写的寄存器间接寻址,不明白);寄存器间接寻址,寄存器寻址
6)SBB SI,[SI]
寄存器寻址;寄存器寻址,寄存器间接寻址
2.9分别说明下列每组指令中的两条指令的区别:
1) MOV AX,TABLE
LEA AX,TABLE
前者是将变量TABLE的内容传递给AX;后者是将TABLE和偏移地址传递给AX
2) AND BL,0FH
OR BL,0FH
前者是BL的内容与0F相与;后者是BL与0FH相或
3) JMP SHORT L1
JMP NEAR PTR L1
前者为短跳转,后者为近跳转
4) MOV AX,[BX]
第三章
3.1
1)使计算机执行某种操作的命令 ;指令
2)表示计算机执行什么操作的符号 ;助记符
3)存放指令机器码的存储器段区 ;代码段
4)指出指令在程序中位置的符号地址 ;标号
5)将汇编语言程序翻译成机器码程序的实用程序 ;汇编程序
3.2试写出完成下列操作的指示性语句:
1)将56H,78,0B3H,100存放在定义为字节变量ARRAY的存储单元中.
ARRAY DB 56H,78,0B3H,100
2)将字数据2965H,45H,2965,0A6H存放在定义为字节变量DATA的存储单元中.
ARRAY DB 65H,29H,45H,95H,0BH,0A6H ;书上在0B和0A6H后面有个0,不什么是什么.
3)将字节数据56H,0C6H,78H,12H存放在字变量ALPHA的存储单元中.并且不改变数据按字节存储的次序
ALPHA DW 0C656H,1278H
4)在BETA为道址的存储单元中连续存放字节数据:2个23,5个'A',10个(1,2),20个空单元。
BETA DB 2 DUP (23),5 DUP ('A'),10 DUP (1,2), 20 DUP (?)
5)在STRING为首址的存储单元中存放字符串'THIS IS A EXAMPE'
STRING DB 'THIS IS A EXAMPE'
3.3下列伪指令序列中,BASUB的值为多少?它表示什么意义?
作者: 218.27.73.* 2005-9-3 09:21 回复此发言
--------------------------------------------------------------------------------
3 汇编语言程序设计课后习题答案
BUFF DB 7,6,'56',?
ARRAY DW 0,67H,7
BASUB EQU ARRAY-BUFF
BASUB的值是5,它表示ARRAY与BUFF的首地址的差.
3.4假设程序中的数据定义如下:
BUF1 DB 100 DUP ('a')
BUF2 DW 1275H,567,0C5H
BUF3 DB 20 DUP (?)
BUF4 DB 7,4,6,9,8
1)用一条指令将BUF1的谝移地址送入BX.
LEA BX,BUF1
2)将BUF2的第三字节数据送入CL
MOV BYTE PTR CL,[BUF2+2]
3)将0A6H送入BUF3的第10个字节单元中
MOV BYTE PTR [BUF3+9],0A6H
4)用伪指令写出BUF1和BUF2二者的总长度(字节数)
L1_2 EQU BUF3-BUF1
5)用一组指令写出BUF2的第二个数据567和BUF4的第三个数据6相加,结果(和)送入BUF3
MOV AL,BUF4+2
MOV AH,0
ADD AX,BUF2+2
MOV BUF3,AX
3.5指出下列第一对伪指令语句的区别:
1)X1 DB 76; X2 EQU 76
前者是向X1的字节单元存入76,后者是将X2的值定义为76.
2)X1 DW 3548H; X2 EQU BYTE PTR X1
前者是定义X1的字单元值为3548,后者是定义X2的值为X1的第一个字节单元的值48.
3)X1 EQU 3; X2 = 3
两者都是赋值语句,但前者只能定义一次,后者可以重复定义.
4)X1 DW 3678H; X2 DB 36H,78H
前者的字节单元内容依次为78,36;后者的字节单元内容依次为36,78.
5)X1 DW 6341H; X2 DW 6341
前者为十六进制的6341;后者为十进制的6341
3.6设置一个数据段DATA_SEC,其中连续存放下列的8个变量,用段定义语句和数据定义语句写出数据段:
1)DATA1为字符串变量:'DATA SEGMENT'
2)DATA2为十进制数字节变量:72,65,-10
3)DATA3为十六进制数字字节变量:109,98,21,40
4)DATA4为10个零的字节变量.
5)DATA5为数字的ASCII字符字节变量:12345
6)DATA6为十进制的字变量:7,9,298,1967
7)DATA7为十六进制的数的字变量:785,13475
8)DATA8为本段中字变量和字节变量之间的字节单元数之差
DATA_SEC SEGMENT
DATA1 DB 'DATA SEGMENT'
DATA2 DB 72,65,-10
DATA3 DB 6DH,62H,15H,28H
DATA4 DB 10 DUP (0)
DATA5 DB '12345'
DATA6 DW 7,9,298,1967
DATA7 DW 0311H,34A3H
D1 EQU DATA6-DATA1
D2 EQU $-DATA6
DATA8 EQU D2-D1
3.7设程序中的数据定义如下:
DATA1 DW ?
DATA2 DB 32 DUP (?)
DATA3 DD ?
DLENGTH EQU $-DATA1
问DLENGTH的值为多少?它表示什么意义?
DLENGTH的值为38,表示DATA1,DATA2,DATA3所占用的字节数之和
3.8指出下列第一小题中的伪指令表达的操作哪些是错误的?错误在哪时?
1)
ALPHA EQU 78H
BETA EQU ALPHA+1
没错.
2)
DATA DB 395
1个字节最多能够表示256
3)
X1 SEG
.
.
.
X1 ENDS
SEG应该写成SEGMENT
4)
ALPHA EQU BETA
BETA没有赋值
5)
COUNT EQU 100
COUNT EQU 78
不可以用EQU给一个变量重复赋值
6)
MAIN PROC
.
.
.
ENDP
过程结束标志,应该有个MAIN
7)ARRAY DW 10 DUP (?)
.
.
.
JMP ARRAY
ARRAY是变量,JMP不能跳到ARRAY处
8)
SEGMENT CODE_SEG
.
.
.
ENDS CODE_SEG
书写格式错误,应写为
CODE_SEG SEGMENT
CODE_SEG ENDS
3.9对于下面的数据定义,写出各条指令执行的结果:
FLDB DW 0A24FH
TABLE DB 32H,52,0C2H,213
TEA EQU WORD PTR TABLE
ARRAY DB 'ABCD'
COUNT EQU $-ARRAY
1)MOV AX,FLDB AL=(4FH)
2)MOV BX,TEA BH=(52H)