微机原理第四五六章作业.docx
《微机原理第四五六章作业.docx》由会员分享,可在线阅读,更多相关《微机原理第四五六章作业.docx(23页珍藏版)》请在冰豆网上搜索。
微机原理第四五六章作业
第四章作业答案
4.1分析汇编语言源程序应该由哪些逻辑段组成?
各段的作用是什么?
语句标号和变量应具备哪3种属性?
【解答】汇编语言源程序应该由若干个逻辑段组成,可以有若干个数据段、代码段、堆栈段和附加数据段,至少要有一个代码段。
各段的作用如下:
(1)代码段用来存放程序和常数。
(2)数据段用于数据的保存。
(3)堆栈段用于保护数据,尤其在子程序调用、中断过程中进行现场信息保护。
(4)附加数据段用于数据的保存。
语句标号和变量应具备的3种属性:
段属性、偏移属性和类型属性。
4.2 指出下列程序中的错误:
STAKSG SEGMENT
DB 100DUP(?
)
STA_SG ENDS
DTSEG SEGMENT
DATA1 DB ?
DTSEG END
CDSEG SEGMENT
MAIN PROC FAR
START:
MOV DS,DATSEG
MOV AL,34H
ADD AL,4FH
MOV DATA,AL
START ENDP
CDSEG ENDS
END
答案:
改正后:
STAKSG SEGMENT
DB 100DUP(?
)
STAKSG ENDS
DTSEG SEGMENT
DATA1 DB ?
DTSEG ENDS
CDSEG SEGMENT
MAIN PROC FAR
ASSUMECS:
CDSEG,DS:
DTSEG,SS:
STAKSG
START:
MOV AX,DTSEG
MOV DS,AX
MOV AL,34H
ADD AL,4FH
MOV DATA1,AL
MOV AH,4CH
INT 21H
MAIN ENDP
CDSEG ENDS
END S
4.3. 将下列文件类型填入空格:
(1).obj
(2).exe (3).crf (4).asm (5).lst (6).map
编辑程序输出的文件有________________;
汇编程序输出的文件有________________;
连接程序输出的文件有________________。
答案:
编辑程序输出文件:
(4)
汇编程序输出文件:
(1),(3),(5)
连接程序输出文件:
(2),(6)
4.4 下面的数据项定义了多少个字节?
DATA_1 DB 6DUP(4DUP(0FFH))
答案:
24字节
4.5. 对于下面两个数据段,偏移地址为10H和11H的两个字节中的数据是一样的吗?
为什么?
DTSEG SEGMENT | DTSEG SEGMENT
ORG 10H | ORG 10H
DATA1 DB 72H | DATA1 DW 7204H
DB 04H | DTSEG ENDS
DTSEG ENDS |
答案:
不一样.分别是72H,04H和04H,72H.存储字时低8位存在低字节,高8位存在高字节.
4.6. 下面的数据项设置了多少个字节?
(1)ASC_DATA DB '1234'
(2)HEX_DATA DB 1234H
答案:
(1)设置了4个字节
(2)设置了2个字节
4.7. 执行下列指令后,AX寄存器中的内容是什么?
TABLE DW 10,20,30,40,50
ENTRY DW 3
.
.
.
MOV BX,OFFSETTABLE
ADD BX,ENTRY
MOV AX,[BX]
答案:
(AX)=40
4.8. 分析下列程序的功能,写出堆栈最满时各单元的地址及内容。
SSEG SEGMENT 'STACK' AT 1000H ;堆栈的段地址为1000H
DW 128DUP(?
)
TOS LABEL WORD
SSEG ENDS
;-------------------------------------------
DSEG SEGMENT
DW 32DUP(?
)
DSEG ENDS
;-------------------------------------------
CSEG SEGMENT
MAIN PROC FAR
ASSUME CS:
CSEG,DSSEG,SS:
SSEG
START:
MOV AX,SSEG
MOV SS,AX
MOV AX,DSEG
MOV DS,AX
MOV AX,4321H
CALL HTOA
RETN:
MOV AH,4CH
INT 21H
MAIN ENDP
;-------------------------------------------
HTOA PROC NEAR
CMP AX,15
JLE B1
PUSH AX
PUSH BP
MOV BP,SP
MOV BX,[BP+2]
AND BX,0FH
MOV [BP+2],BX
POP BP
MOV CL,4
SHR AX,CL
CALL HTOA
B1:
POP AX
B2:
ADD AL,30H
JL PRT
ADD AL,07
PRT:
MOV DL,AL
MOV AH,2
INT 21H
RET
HTOA ENDP
CSEG ENDS
; ;-----------------------------------------
END START
答案:
1000:
0F2H
B1
1000:
0F4H
3
1000:
0F6H
B1
1000:
0F8H
2
1000:
0FAH B1
1000:
0FCH 1
1000:
0FEH RETN
1000:
100H
4.9下面是将内存一字节数据高4位和低4位互换并放回原位置的程序,找出错误并改正。
DATASEGMENT
DD1DB23H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEASI,OFFSETDD1
MOVAL,[SI]
MOVCL,4
RCRAL,CL
MOV[SI],AL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
【解答】程序第8行错误:
LEASI,OFFSETDD1,应去掉OFFSET;
程序第10行错误:
RCRAL,CL,应使用ROR或ROL,改为RORAL,CL
4.10 编写程序,比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示"MATCH",若不同则显示"NOMATCH"。
答案:
datarea segment
string1 db 'asfioa'
string2 db 'xcviyoaf'
mess1 db 'MATCH','$'
mess2 db 'NOMATCH','$'
datarea ends
prognam segment
assumecs:
prognam,ds:
datarea
main proc far
start:
push ds
sub ax,ax
push ax
mov ax,datarea
mov ds,ax
mov es,ax
begin:
mov cx,string2-string1
mov bx,mess1-string2
cmp bx,cx
jnz dispno
lea dx,addr
lea si,string1
lea di,string2
repe cmpsb
jne dispno
mov ah,9
lea dx,mess1
int 21h
ret
dispno:
mov ah,9
lea dx,mess2
int 21h
ret
main endp
prognam ends
end start
4.11根据字节变量control中的各位被置位情况控制程序转移到8个远过程中的一个。
【解答】
DATASEGMENT
SUBSTABLEDWSUBR1
DWSUBR2
DWSUBR3
DWSUBR4
DWSUBR5
DWSUBR6
DWSUBR7
DWSUBR8
CONTROLDB40H
DATAENDS
SS_SEGSEGMENTSTACK
DB100DUP(0)
SS_SEGENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
SS_SEG
MAINPROCFAR
PUSHDS
XORAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVBX,OFFSETSUBSTABLE
MOVAL,CONTROL
DIVERT:
RCRAL,1
JCGETAG
ADDBX,2
JMPSHORTDIVERT
GETAG:
CALL[BX]
RET
MAINENDP
SUBR1PROC
…………
RET
SUBR1ENDP
…………
SUBR8PROC
…………
RET
SUBR8ENDP
CODEENDS
ENDMAIN
4.12编写一个程序,接收从键盘输入的10个十进制数字,输入回车符则停止输入,然后将这些数字加密后(用XLAT指令变换)存入内存缓冲区BUFFER。
加密表为;
输入数字:
0,1,2,3,4,5,6,7,8,9
密码数字:
7,5,9,1,3,6,8,0,2,4
答案:
Datasegment
scode db 7,5,9,1,3,6,8,0,2,4
buffer db 10dup(?
)
Dataends
Codesegment
assumecs:
prognam,ds:
datarea
start:
mov ax,Data
mov ds,ax
mov si,0
mov cx,10
lea bx,scode
input:
mov ah,01
int 21h
cmp al,0ah
jz exit
and al,0fh
xlat
mov buffer[si],al
inc si
loop input
exit:
movah,4ch
int21h
Codeends
Endstart
4.13从键盘输入一系列字符,以回车符结束,编程统计其中非数字字符的个数。
【解答】
DATASEGMENT
BLOCKDB100DUP(?
)
COUNTDB?
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
MOVDL,0
LEASI,BLOCK
LP:
MOVAH,1
INT21H
CMPAL,0DH
JZEXIT
MOV[SI],AL
CMPAL,30H
JAENEXT
CMPAL,39H
JBENEXT
INCDL
NEXT:
INCSI
JMPLP
EXIT:
MOVCOUNT,DL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
4.14请用16进制和10进制分别显示内存单元中一个字节的有符号数。
【解答】
DATASEGMENT
DATA1DB088H
DATA2DB4DUP(0)
DATAENDS
STACKSEGMENTSTACK
DB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
MAINPROCFAR
PUSHDS
XORAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX
HEXN:
MOVAL,DATA1
MOVCL,4
SHRAL,CL
CALLDISPL1
MOVAL,DATA1
ANDAL,0FH
CALLDISPL1
DECN:
MOVAL,DATA1
SHLAL,1
JNCEEE
MOVDL,'-'
MOVAH,2
INT21H
MOVAL,DATA1
NEGAL
JMPDECN0
EEE:
MOVAL,DATA1
DECN0:
LEABX,DATA2
XORSI,SI
MOVDL,10
DECN1:
XORAH,AH
DIVDL
MOV[BX+SI],AH
INCSI
ANDAL,0FFH
JZAAA
JMPDECN1
AAA:
DECSI
JZBBB
MOVAL,BYTEPTR[BX+SI]
CALLDISPL1
JMPAAA
BBB:
MOVAL,BYTEPTR[BX]
CALLDISPL1
RET
MAINENDP
DISPL1PROC
PUSHAX
ADDAL,30H
CMPAL,39H
JNACCC
ADDAL,07H
CCC:
MOVDL,AL
MOVAH,2
INT21H
POPAX
RET
DISPL1ENDP
CODEENDS
ENDMAIN
4.15在数据段中以buffer单元开始连续存放10个8位二进制无符号数,将其中最大数找出来,存于max单元中,试编程。
【解答】
datasegment
bufferdb27,17,100,65,12,36,79,41,88,3
maxdb?
dataends
ss_segsegmentstack
db100dup(0)
ss_segends
codesegment
assumecs:
code,ds:
data,ss:
ss_seg
mainprocfar
movax,data
movds,ax
movcx,9
movbx,0
moval,buffer[bx]
main1:
addbx,2
cmpal,buffer[bx]
jgenext
moval,buffer[bx]
next:
loopmain1
movmax,al
movax,4c00h
int21h
mainendp
codeends
endmain
4.16在数据段longdata中存放32位二进制无符号数(低位在前),将该变量以16进制形式显示输出,试编程。
【解答】
DATASEGMENT
LONGDATADD0123ABC