汇编第46章作业答案.docx
- 文档编号:29471641
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:14
- 大小:54.62KB
汇编第46章作业答案.docx
《汇编第46章作业答案.docx》由会员分享,可在线阅读,更多相关《汇编第46章作业答案.docx(14页珍藏版)》请在冰豆网上搜索。
汇编第46章作业答案
第四章汇编语言程序格式
4.1指令下列指令的错误
(1) MOV AH,BX ;寄存器类型不匹配
(2) MOV [BX],[SI] ;不允许两个都是存储器操作数
(3) MOV AX,[SI][DI] ;不能用两个变址连用,其中一个应为基址
(4) MOV MYDAT[BX][SI],ES:
AX ;寄存器直接寻址不能使用段跨越前缀
(5) MOV BYTE PTR[BX],1000 ;源操作数与目的操作数长度不一致
(6)MOV BX,OFFSET MYDAT[SI];OFFSET 不能与复杂操作数相连
(7)MOV CS,AX ;不能对CS赋值
(8)MOV ECX,AX ;操作数类型不同
4.5
4.8PLENTH的值为22,它表示该数据段的长度。
4.14
(1)(AX)=1
(2)(AX)=2 (3)(CX)=14H (20)
(4)(DX)=28H(2*20=40) (5)(CX)=1
4.17程序如下(直接使用32位寄存器,若使用16位寄存器则须将高低字分别相加):
D_SEG SEGMENT ;数据段定义
AUGEND DD 99251
SUMDD?
D_SEG ENDS
E_SEG SEGMENT ;附加段定义
ADDEND DD-15926
E_SEG ENDS
C_SEG SEGMENT ;代码段定义
ASSUME CS:
C_SEG , DS:
D_SEG,ES:
E_SEG
START:
MOVAX,D_SEG
MOVDS,AX
MOVAX,E_SEG
MOVES,AX
MOVEAX,DS:
AUGEND
ADDEAX,ES:
ADDEND
MOV DS:
SUM,EAX
MOVAX,4C00H
INT21H
C_SEG ENDS
END START ;结束
4.19需要加上PTR伪操作的有:
(3)(4)
第五章循环与分支程序设计
5.1
.modelsmall
.code
mainprocfar
start:
pushds
movax,0
pushax;保存DOS现场
again:
movah,01H
int21H;等待从键盘输入字符并回显
cmpal,61H;与a比较
jlexit;判断是否为小写字母
cmpal,7BH;与z(7B)的下一个字符比较
jgeexit
subal,20H;转变为大写字母的ASCII码
movdl,al
movah,2
int21H;显示大写字母
leabx,buff
again:
movah,1
int21h
cmpal,61H
jlnext
cmpal,7BH
jgenext
subal,20H
mov[bx],al
incbx
jmpagin
next:
incbx
mov[bx],’$’
leadx,buff
movah,9
int21h
jmpagain;继续输入
exit:
ret;不是小写字母退出程序
endstart;结束
5.5
.modelsmall
.code
Mainprocfar
start:
pushds
subax,ax
pushax
input:
movah,01H
int21H
cmpal,20H;按下空格键退出程序
jeexit
cmpal,30H
jleinput;小于等于0重新输入
cmpal,3AH
jgeinput;大于等于10重新输入
subal,30H;ASCII码转变为数值
movcx,ax
andcx,00FFH;高字节清零,保留低字节
lop:
movdl,07H;响铃的ASCII码
movah,2
int21H
looplop;响铃n次
jmpinput
exit:
ret
mainendp
endstart
5.7
Dataaresegment
DATADW3322H,4555H,200H,3544H,1245H;字数组data的元素
numDB($-DATA)/2;字个数,100d
dataareends
codesegment
assumecs:
code,ds:
dataare
MAINPROCFAR
start:
pushds
movax,0
pushax
movax,dataare
movds,ax
movdx,0;偶数个数计数
movcx,num;循环判断100次
movsi,0;数组元素偏移地址
lop:
movbx,WORDPTRDATA[si];寄存器相对寻址
testbx,1;与1相与
jnznext;ZF=1结果为0,是偶数,不是则跳转
addDX:
incdx;偶数个数加1
cmpdx,1
jefirstAXValue;判断是否为第一个,是则跳转
compare:
cmpbx,ax
jgenext
movax,bx;ax保存最小的偶数
next:
ADDsi,2;字数组
Looplop
jmpexit;循环结束后退出程序
firstAXvalue:
movax,WORDPTRDATA[si];保存第一个偶数到ax
jmpnext;跳转到下一个元素
exit:
ret
codeends
endstart
5.12
.modelsmall
.data
;定义100个字
memdw12,0,0,0,0,0,1,2,3,6,4,7,8,2,1,0,0,54,5,0,2,4,7,8,
dw0,5,6,2,1,4,8,5,1,45,7,5,1,2,0,2,4,0,2,54,0,12,0,
dw0,0,0,0,1,2,3,6,4,7,8,2,1,0,0,54,5,0,2,4,7,8,0,5,6,2,1,
dw4,8,5,1,45,7,5,1,2,0,2,4,0,2,54,0,45,7,5,1,2,0,2,4,0,2
.code
MAINPROCFAR
start:
pushds
andax,0
pushax
movax,@data
movds,ax
movbx,198;bx指向最后一个元素地址
movcx,100;循环比较100次
movsi,0;si头指针
repeat:
cmpmem[si],0;元素0与0比较
jnelop;不等于0跳转不处理
callsort;等于0则调用sort将后续项向前压缩并填充最后0元素
lop:
addsi,2;指向下一个元素
looprepeat
exit:
ret
MAINENDP
sortprocnear
pushcx;移动的次数
subsi,2;si指向0元素的前一个元素
pushsi
s:
addsi,2;0元素位置
movdx,mem[si+2]
movmem[si],dx;后续元素向前压缩
loops
movmem[bx],0;末尾元素填0
subbx,2;bx指针向前移
popsi;0元素前一个字符的位置
popcx
ret
sortendp
endstart
5.18
DSEG SEGMENT
GRADEDW30DUP(?
);存放30个学生的成绩
RANKDW30DUP(0);学生名次表
DSEG ENDS
CSEG SEGMENT
MAIN PROC FAR
ASSUMECS:
CSEG,DS:
DSEG
START:
PUSHDS
SUBAX,AX
PUSHAX;保存dos现场
MOVAX,DSEG
MOVDS,AX;初始化数据段寄存器
BEGIN:
MOVDI,0;学号指针
MOVCX,30;外循环次数,处理30个成绩
LOOP1:
PUSHCX
MOVCX,30;内循环次数,每个成绩比较30次
MOVSI,0;成绩表指针
MOVAX,GRADE[DI];成绩送ax
MOVDX,0;记录高于该成绩的人数
LOOP2:
CMPGRADE[SI],AX;比较成绩
JBEGOON;小于等于跳转处理
INCDX;高于则人数+1
GOON:
ADDSI,2;指向下一个成绩
LOOPLOOP2
INCDX;名次等于人数+1
MOVRANK[DI],DX;保存名次
ADDDI,2;下一个学生
POPCX
LOOP LOOP1
RET
MAIN ENDP
CSEG ENDS
END START
第六章子程序结构
6.4、
6.7、
datasgsegment
grade db76,69,84,90,73,88,99,63,100,80
s6 db0;60~69人数
s7 db0
s8 db0
s9 db0
s10 db0
datasgends
codesgsegment
main procfar
assumecs:
codesg,ds:
datasg
start:
pushds
subax,ax
pushax
movax,datasg
movds,ax
callsub1;调用子程序统计各段人数
ret
main endp
sub1 procnear
movcx,10;循环次数
movsi,0;指针
loop1:
moval,grade[si];取成绩送al
cmpal,60
jl next5;小于60不统计
cmpal,70
jgenext1
incs6;小于70则s6+1
jmpshortnext5
next1:
cmpal,80
jgenext2
incs7
jmpshortnext5
next2:
cmpal,90
jgenext3
incs8
jmpshortnext5
next3:
cmpal,100
jgnext5
jenext4
incs9
jmpshortnext5
next4:
incs10
next5:
incsi
looploop1
ret
sub1 endp
codesgends
endstart
6.8、
DATASEGMENT
MAXLENDB40;子节数组tabel的最大长度
NDB?
;实际长度
TABLEDB40DUP(?
);缓冲区
CHARDB'A';查找字符'A'
EVEN;字类型从偶数地址开始
_ADDRDW3DUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
MAINPROCFAR
START:
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
LEADX,MAXLEN
MOVAH,0AH
INT21H ;从键盘接收字符串到缓冲区
MOV_ADDR,OFFSETTABLE
MOV_ADDR+2,OFFSETN
MOV_ADDR+4,OFFSETCHAR;设置参数地址表
MOVBX,OFFSET_ADDR;通过地址表传送变量地址
CALLCOUNT ;计算CHAR的出现次数
CALLDISPLAY;显示
RET
MAINENDP
COUNTPROCNEAR;COUNT子程序计算
PUSHSI
PUSHDI
PUSHAX
PUSHCX
MOVDI,[BX];di指向tabel
MOVSI,[BX+2];si=n的地址
MOVCL,BYTEPTR[SI];cl=n
MOVCH,0;cx=n循环次数
MOVSI,[BX+4];si指向char的地址
MOVAL,BYTEPTR[SI];al=字符char
MOVBX,0;记录出现次数
AGAIN:
CMPAL,BYTEPTR[DI];与字符串中每个字符比较
JNEL1;不等则跳转
INCBX;出现次数加1
L1:
INCDI;指向下一个字符
LOOPAGAIN
POPCX
POPAX
POPDI
POPSI
RET
COUNTENDP
DISPLAYPROCNEAR;DISPLAY子程序
CALLCRLF ;显示回车和换行
MOVDL,CHAR
MOVAH,2
INT21H;显示字符
MOVDL,20H
MOVAH,2
INT21H;显示空格
MOVAL,BL;出现次数《=15,只需1位16进制
ANDAL,0FH
ADDAL,30H
CMPAL,3AH
JLPRINT
ADDAL,7;大写字母
PRINT:
MOVDL,AL
INT21H;显示出现次数
CALLCRLF
RET
DISPLAYENDP
CRLFPROCNEAR;CRLF子程序
MOVDL,0DH
MOVAH,2
INT21H;显示回车
MOVDL,0AH
MOVAH,2
INT21H;显示换行
RET
CRLFENDP
CODEENDS
ENDSTART;结束
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 46 作业 答案