汇编上机网页答案.docx
《汇编上机网页答案.docx》由会员分享,可在线阅读,更多相关《汇编上机网页答案.docx(22页珍藏版)》请在冰豆网上搜索。
![汇编上机网页答案.docx](https://file1.bdocx.com/fileroot1/2022-11/23/701cd566-b1d1-4025-8958-5d066d78804e/701cd566-b1d1-4025-8958-5d066d78804e1.gif)
汇编上机网页答案
第一次上机作业
1.从键盘上接受一个字符,找出它的前导字符和后继字符,按序显示这三个字符。
寄存器分配:
AL:
暂存数据。
算法:
1、接受字符,存入AL。
2、(AL)→A。
3、(AL)自加1。
4、(AL)→A+1。
5、(AL)自加1。
6、(AL)→A+2。
7、‘$’→A+3。
8、输出以A为首地址的字符串。
代码:
STACKSEGMENTSTACK
DB100DUP(?
)
STACKENDS
DATASEGMENT
BDB‘PLEASEENTERACHARACTER:
$’;定义变量B,以其为首地址依次存放提示字符串。
ADB5DUP(?
) ;定义变量A,同时开辟连续5个字节空间。
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
LEADX,B
MOVAH,9
INT21H
MOVDL,0DH
MOVAH,2
INT21H
MOVDL,0AH
MOVAH,2
INT21H
MOVAH,1
INT21H
DECAL
MOVA,AL
INCAL
MOVA+1,AL
INCAL
MOVA+2,AL
MOVA+3,'$'
MOVDL,0AH
MOVAH,2
INT21H
MOVDL,0DH
MOVAH,2
INT21H
LEADX,A
MOVAH,9
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
输出:
PLEASEENTERACHARACTER:
7(输入)
678(显示)
2.从键盘上接受一个数字字符,如不是,显示“notodd”,否则显示“odd”。
寄存器分配:
AL:
暂存数据。
算法:
1、接受字符,存入AL。
2、若AL<0,转到S3。
3、否则,若AL>0,转到S3。
4、否则,输出字符串“ODD”。
5、程序结束。
注:
S3功能是输出字符串“NOTODD”。
代码:
STACKSEGMENTSTACK
DB100DUP(?
)
STACKENDS
DATASEGMENTADB'N','O','T','','O','D','D','$';定义变量A,以其为首地址依次存放字符串。
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVAH,1
INT21H
CMPAL,'0'
JBS3
CMPAL,'9'
JAS3
MOVDL,0AH
MOVAH,2
INT21H
MOVDL,0DH
MOVAH,2
INT21H
LEADX,A+4
MOVAH,9
INT21H
JMPEXIT
S3:
MOVDL,0AH
MOVAH,2
INT21H
MOVDL,0DH
MOVAH,2
INT21H
LEADX,A
MOVAH,9
INT21H
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
输出:
7(输入)
ODD(显示)
第二次作业
1. 将以H为首地址的字节存储区中的既能被3整除也能被13整除的无符号整数的个数(假定≤9)显示出来,同时对应的显示它们分别对应的地址偏移量。
(利用多种寻址方式做)
(1)变址寻址:
寄存器分配:
BX:
作为H为首地址的存储区的地址指针。
SI:
作为A为首地址的存储区的地址指针。
DI:
同上。
AX:
暂存数据。
代码:
STACKSEGMENTSTACK
DB100DUP(?
)
STACKENDS
DATASEGMENT
HDB3,5,7,78,13,39
N=$-H
ADBNDUP(?
)
CDB?
DDB?
0
EDB?
FDB'THENUMBERIS:
$'
GDB0AH,0DH,'$'
IDB'ADDRESSOFFSET:
$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVBX,0
MOVSI,0
MOVDI,0
MOVE,0
L1:
CMPBX,N
JAEPRINT
MOVAL,H[BX]
MOVD,AL
MOVAX,WORDPTRD
MOVC,3
DIVC
CMPAH,0
JNEL2
MOVAX,WORDPTRD
MOVC,13
DIVC
CMPAH,0
JNEL2
INCE
MOVA[SI],BL
ADDA[SI],30H
INCSI
INCBX
JMPL1
L2:
INCBX
JMPL1
PRINT:
LEADX,F
MOVAH,9
INT21H
LEADX,G
MOVAH,9
INT21H
ADDE,30H
MOVDL,E
MOVAH,2
INT21H
LEADX,G
MOVAH,9
INT21H
L3:
CMPDI,SI
JAEEXIT
LEADX,I
MOVAH,9
INT21H
MOVDL,A[DI]
MOVAH,2
INT21H
MOVDL,''
MOVAH,2
INT21H
INCDI
JMPL3
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
输出:
THENUMBERIS:
2
ADDRESSOFFSET:
3ADDRESSOFFSET:
5
(2)寄存器间接寻址:
寄存器分配:
BX:
作为H为首地址的存储区的地址指针。
SI:
作为A为首地址的存储区的地址指针。
DI:
同上。
AX:
暂存数据。
CX:
循环计数器和偏移量计数器。
代码:
STACKSEGMENTSTACK
DB100DUP(?
)
STACKENDS
DATASEGMENT
HDB3,5,7,78,13,39
N=$-H
ADBNDUP(?
)
CDB?
DDB?
0
EDB?
FDB'THENUMBERIS:
$'
GDB0AH,0DH,'$'
IDB'ADDRESSOFFSET:
$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVE,0
MOVCX,0
MOVSI,0
MOVDI,0
LEABX,H
L1:
CMPCX,N
JAEPRINT
MOVAL,[BX]
MOVD,AL
MOVAX,WORDPTRD
MOVC,3
DIVC
CMPAH,0
JNEL2
MOVAX,WORDPTRD
MOVC,13
DIVC
CMPAH,0
JNEL2
INCBX
INCE
MOVA[SI],CL
ADDA[SI],30H
INCCX
INCSI
JMPL1
L2:
INCBX
INCCX
JMPL1
PRINT:
LEADX,F
MOVAH,9
INT21H
ADDE,30H
MOVDL,E
MOVAH,2
INT21H
LEADX,G
MOVAH,9
INT21H
L3:
CMPDI,SI
JAEEXIT
LEADX,I
MOVAH,9
INT21H
MOVDL,A[DI]
MOVAH,2
INT21H
LEADX,G
MOVAH,9
INT21H
INCDI
JMPL3
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
输出:
THENUMBERIS:
2
ADDRESSOFFSET:
3
ADDRESSOFFSET:
5
(3)基址变址寻址:
寄存器分配和流程图与
(2)基本类似。
补充:
DI还作为以H为首址各变量的偏移量。
BX只存储H的地址。
代码:
STACKSEGMENTSTACK
DB100DUP(?
)
STACKENDS
DATASEGMENT
HDB3,5,7,78,13,39
N=$-H
ADBNDUP(?
)
CDB?
DDB?
0
EDB?
FDB'THENUMBERIS:
$'
GDB0AH,0DH,'$'
IDB'ADDRESSOFFSET:
$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVE,0
MOVCX,0
MOVSI,0
MOVDI,0
LEABX,H
L1:
CMPCX,N
JAEPRINT
MOVAL,[BX+DI]
MOVD,AL
MOVAX,WORDPTRD
MOVC,3
DIVC
CMPAH,0
JNEL2
MOVAX,WORDPTRD
MOVC,13
DIVC
CMPAH,0
JNEL2
INCDI
INCE
MOVA[SI],CL
ADDA[SI],30H
INCCX
INCSI
JMPL1
L2:
INCDI
INCCX
JMPL1
PRINT:
LEADX,F
MOVAH,9
INT21H
ADDE,30H
MOVDL,E
MOVAH,2
INT21H
LEADX,G
MOVAH,9
INT21H
MOVDI,0
L3:
CMPDI,SI
JAEEXIT
LEADX,I
MOVAH,9
INT21H
MOVDL,A[DI]
MOVAH,2
INT21H
LEADX,G
MOVAH,9
INT21H
INCDI
JMPL3
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
输出:
THENUMBERIS:
2
ADDRESSOFFSET:
3
ADDRESSOFFSET:
5
2. 在以TAB为首地址的字存储区中存放有N个无符号数,试统计低3位全为1的数的个数(个数设为≤9),并显示。
寄存器分配:
BX:
作为TAB为首地址的存储区的地址指针。
CL:
测试低3位全为1的计数器。
DX:
临时存储数据。
代码:
STACKSEGMENTSTACK
DB100DUP(?
)
STACKENDS
DATASEGMENT
TABDW1,0,7,15
N=($-TAB)/2
ADB'THETOTALIS:
$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVBX,0
MOVCL,0
L1:
CMPBX,(N-1)*2
JA PRINT
MOVDX,7
ANDDX,TAB[BX]
CMPDX,111B
JE L3
L2:
ADDBX,2
JMPL1
L3:
INCCL
ADDBX,2
JMPL1
PRINT:
LEADX,A
MOVAH,9
INT21H
ADDCL,30H
MOVDL,CL
MOVAH,2
INT21H
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
输出:
THETOTALIS:
2
3. 键盘接受一串字符到BUF为首地址的字节单元中,要求用下列方法分别编程,将它们以相反的次序显示在屏幕的下一行中:
(1).按地址从尾向前依次显示。
寄存器分配:
BX:
作为BUF+2为首地址的存储区的地址指针。
代码:
STACKSEGMENTSTACK
DB100DUP(?
)
STACKENDS
DATASEGMENT
BUFDB100
DB?
DB100DUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
LEADX,BUF
MOVAH,10
INT21H
MOVDL,0AH
MOVAH,2
INT21H
MOVBL,BUF+1
MOVBH,0
DECBX
L1:
MOVDL,[BUF+2][BX]
MOVAH,2
INT21H
DECBX
CMPBX,0
JGEL1
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
输出:
dadasd(输入)
dsadad(结果)
(2).利用堆栈反向显示。
寄存器分配:
BX:
作为BUF+2为首地址的存储区的地址指针,也存储循环最大次数。
CX:
循环计数器及暂存数据。
代码:
STACKSEGMENTSTACK
DB100DUP(?
)
STACKENDS
DATASEGMENT
BUFDB100