1、汇编语言王爽答案第一章检测点1.11) 13(2) 1024,0,1023(3) 8192,1024(4) 230,220,210(5) 64,1,16,4(6) 1,1,2,2,4(7) 512,256(8) 二进制 注:符号指求幂运算(如: 230指2的30次方)第二章检测点2.1(1)大家做这题的时候一定要注意,要看清楚数制,比如是二进制还是十进制,还是十六进,我当时没注意,做错了!呵呵!第一空:F4A3H第二空:31A3H第三空:3123H第四空:6246H第五空:826CH第六空:6246H第七空:826CH第八空:04D8H第九空:0482H第十空:6C82H第十一空:D882H第
2、十二空:D888H第十三空:D810H第十四空:6246H(2)mov ax,2add ax,axadd ax,axadd ax,ax检测点2.2(1)00010H 1000fH(2)0001H 2000H检测点2.3共修改了4次ip 第一次mov ax,bx 第二次是sub ax,ax 第三次是jmp ax 第四次是执行 jmp ax 最后ip的值是0 因为ax的值是零!检测点3.1(1)第一空:2662H第二空:E626H第三空:E626H第四空:2662H第五空:D6E6H第六空:FD48H第七空:2C14H第八空:0000H第九空:00E6H第十空:0000H第十一空:0026H第十二
3、空:000CH注意:ax中存取的是字型数据 ,高地址存放高字节,低地址存放低字节!(一定要小心)(2)写出cpu的执行序列 Mov ax,6622Jmp 0ff0:0100Mov ax,2000HMov ds,axMov ax ,0008Mov ax,0002指令执行顺序 寄存器 CS IP DS AX BX 初值 2000H 0000 1000H 0 0 mov ax,6622h 2000H 0003 1000H 6622H 0000 jmp 0ff0:0100 1000h 0000 1000H 6622H 0000 mov ax,2000h 1000H 0003 1000H 2000H 0
4、000 mov ds,ax 1000H 0005 2000H 2000H 0000 mov ax,0008 1000H 0008 2000H C389H 0000 mov ax,0002 1000H 000B 2000H EA66H 0000 数据和程序在计算机中都是以二进制的形式存放的,在区别程序和数据时,关键是看段地址,如果段地址是ds段,说明该内存中存放的是数据,如果段地址是cs段,说明该内存中存放的是程序指令 检测点3.2(1)Mov ax,2000HMov ss,axMov sp,0010H(2)Mov ax,1000HMov ss,axMov sp,0000H注意:出栈时和入栈时的
5、顺序,空栈时栈顶指向的是最高端地址!栈满是栈顶指针指向的是最底端地址!2。实验任务(1)5BEA5CCA 30F0602300FE 2200:0100 5CCA00FC 2200:00FE 602300FE 60230100 5CCA 00FE 2200:0100 30F000FC 22000:00FC 2E39 (2) 因为在DEBUG 中T命令在执行修改寄存器ss的指令时,会产生中断,将现场保护起来,下一条指令也紧接着被执行!实验三:该实验自己做吧 我做出来的东西只是我pc上的数据,可能在别的pc做出来的结果会不一样,在加之数据太多,我做了两次数据都没有完整的记下来,只好作罢!实验四: b
6、x和loop的使用(1)assume cs:code code segment mov ax,0 mov ds,ax mov cx,64 mov bx,200h s: mov ds:bx,ax inc bx inc axloop s mov ax,4c00H int 21hcode endsEnd(2)如上题 我一不小心写出来就是九条指令了!呵呵!(3)具体做法是将那段指令写道内存中,察看其在内存中的起始地址和终止地址,然后将该内存的内容复制到0:200处就可以了!检测点6.1(1)Mov cs:dx,ax(2)第一空:cs第二空:26或者1ah第三空:pop cs:dx发表于 2008年08
7、月19日01:11:00 | 评论( 2 ) | 编辑| 举报| 收藏 旧一篇:常用命令(转) | 新一篇:实验五: 编写、调试具有多个段的程序 Copyright maokaijiang Powered by CSDN Blog 十一川藏疯狂之旅 本文来自CSDN博客,转载请标明出处:王爽汇编语言答案(本答案是自己做的 所有题目已在deubg中调试;但难免有差错,发现的提醒我 email:maokaijiang1211 谢谢) (1) 1931(一直保持不变,由于pc不同 答案有可能不一样)cs=1943 ss=1941 ds=1931 (由于pc不同,所以答案也可能不同,这只是机子上的数据
8、)第一空:X2 第二空:X1 (2) 1.一直不变2.答案不一样,就不写了3.X-2,X-14.(N/16+1)*16 (3)1.一直不变2.答案不一样3.X+3,X+4 (4)答:可能执行,如果不指明标号,cpu顺序执行指令,所有可能正确执行!(5);*;将a段和b段指的数据依次相加,将结果保存到c段中;*assume cs:codea segment db 1,2,3,4,5,6,7,8a endsb segment db 1,2,3,4,5,6,7,8b endsd segment db 8 dup(0)d ends;*;代码段;*code segmentstart: mov ax,d
9、mov es,ax mov ax,a mov ds,ax mov cx,8 mov ax,0 mov bx,0again1: mov dx,ds:bx mov es:ax,dx inc bx inc axloop again1 mov ax,b mov ds,ax mov ax,0 mov bx,0 mov cx,8 mov dx,0again2: add dx,ds:bx mov es:ax,dx inc ax inc bxloop again2 mov ax,4c00h int 21hcode endsend start(6);*;编写程序,用push指令将a段中的word数据,逆序存储到
10、b段中;*assume cs:code a segment dw 1,2,3,4,5,6,7,8a endsb segment dw 0,0,0,0,0,0,0,0b endscode segmentstart: mov ax,b mov ss,ax mov sp,10h mov ax,a mov ds,ax mov bx,0 mov cx,8s: push bx add bx,2 loop s mov ax,4c00h int 21hcode endsend start本文来自CSDN博客,转载请标明出处:ht(1)本题略!(2);*;编程,将datasg 段中的每个单词的前四个字母改写为大
11、写字母;*assume cs:codesg,ss:stacksg,ds:datasgstacksg segment dw 0,0,0,0,0,0,0,0stacksg endsdatasg segment db 1. displsy db 2. brows db 3. replace db 4. modify datasg segmentcodesg segmentstart: mov ax,stacksg mov ss,ax mov sp,16 mov ax,datasg mov ds,ax mov dx,0 mov cx,4 s0: push cx mov si,0 mov cx,4 s1
12、: mov al,bx+si+4 add al,11011111B mov bx+si+4,al inc si loop s1 add dx,16 pop cx loop s0 mov ax,4c00h int 21hcodesg ends end start本文来自CSDN博客,转载请标明出处:assume cs:codesg,ds:data,es:table data segment db 1975,1976,1977,1978,1979,1980,1981,1982,1983 db 1984,1985,1986,1987,1988,1989,1990,1991,1992 db 1993,
13、1994,1995 ;以上是表示21年的21个字符串 dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 ;以上是表示21年公司总收的21个dword型数据 dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 dw 11542,14430,45257,17800 ;以上是表示21年公司雇员
14、人数的21个word型数据data ends table segment db 21 dup(year summ ne ? )table endscodesg segmentstart: mov ax,data mov ds,ax mov ax,table mov es,ax mov cx,21 mov bx,0 mov si,0 mov di,0 s0:;*;把年份送到table中;* mov al,bx mov es:di,al mov al,bx+1 mov es:di+1,al mov al,bx+2 mov es:di+2,al mov al,bx+3 mov es:di+3,al;
15、*;把收入送到table中;* mov ax,54hbx mov dx,56hbx mov es:5hdi,ax mov es:7hdi,dx;*;把人数送到table中;* mov ax,0A8hsi mov es:0Ahdi,ax;*;计算人均收入并把其送到table中;* mov ax,54hbx div word ptr 0A8hsi mov es:0Chdi,ax add si,2 add di,16 add dx,4 loop s0 ;循环21次 mov ax,4c00h int 21hcodesg endsend start本文来自CSDN博客,转载请标明出处: 第九章 收藏 检
16、测点9.1 (1)程序如下: assume cs:codedata segment db 0,0,0,0,0,0,0,0data endscode segmentstart:mov ax,data mov ds,ax mov bx,0 jmp word ptr bx+1 mov ax,4c00h int 21hcode endsends start 理由是:要是jmp跳转后执行第一条指令,本条指令是word ptr是段内转移 必须满足ip=0 所以ds:bx+1的值必须为零 ,也就是data段的第二个数据必须为零 (2)第一空:bx 第二空:cs (3) 本题可以先用debug将 内存2000
17、:1000中的内容写为BE 00 06 00 .然后再调 试可得到 cs=0006h ip=00BEh检测点9.2 ;*;实现在内存2000H段中查找第一个值为零的字节,;找到后,将它的偏移地址存储到dx中;*assume cs:code code segment start: mov ax,2000H mov ds,ax mov bx,0 s: mov cl,bx mov ch,0 jcxz ok inc bx jmp short s ok: mov dx,bx mov ax,4c00h int 21hcode ends end start注:利用jcxz判断cx是否等于零来发生跳转,注意判
18、断的是一个字节! 检测点9.3;*;利用loop指令,实现在内存2000H段中查找第一个值为零的byte,找到后;将它的偏移地址存储到dx中;*assume cs:code code segmentstart: mov ax,2000H mov ds,ax mov bx,0 s: mov cl,bx mov ch,0 jmp ok inc bx loop s ok: dec bx mov dx,bx mov ax,4c00h int 21hcode ends end start实验八: assume cs:codesgcodesg segment mov ax,4c00h int 21hsta
19、rt: mov ax,0 s: nop nop mov di,offset s mov si,offset s2 mov ax,cs:si mov cs:di,ax s0: jmp short s s1: mov ax,0 int 21h mov ax,0 s2: jmp short s1 nop codesg ends end start 注:程序可以正常运行,本程序主要考察了转移指令的使用!实验九:;*;编程: 在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串welcome to masm!.;实验原理见书中186页 ;*assume cs:code,ds:data,es:display
20、,ss:stackdata segment db welcome to masm! db 02H,24H,71Hdata endsstack segment db 16 dup(0)stack endsdisplay segment db 1024 dup(0)display ends code segmentstart: mov ax,data mov ds,ax mov si,0 mov ax,0b872H ;定义12行中间的起始位置 mov es,ax mov cx,3 mov di,0;*;做三次外循环,每次显示一种颜色;* s0: push cx push ax mov cx,16
21、mov bx,0;*;做上六次内循环,将数据段定义的字符串写入内存中;* s: mov al,bx mov es:si,al mov al,di+10h mov es:si+1,al add si,2 inc bx loop s sub si,32 ;将si回到初始位置 add si,160 ;换行 pop ax pop cx inc di ;改变颜色 loop s0 mov ax,4c00h int 21hcode ends end start本文来自CSDN博客,转载请标明出处: 第十章 收藏 检测点10.1第一空:1000第二空:0000检测点10.2ax=6注意: 执行call s是i
22、p的值为6 接着进栈,然后执行pop ax 相当于把ip的值放到ax中!检测点10.3ax=1100H注意:执行callfar ptr s后 cs=1000 ip=3(10H)接着进栈 然后执行pop ax 此时ax=3=add ax,ax此时ax=6(100H)=pop bx 此时bx=1000 =add ax,bx此时ax=1100H检测点10.4ax=000B 具体我就不一一分析了,呵呵!检测点10.5(1) ax=3(1)ax=1 bx=0实验十:编写子程序(1)显示字符串;*;显示字符串的子程序 (dh)= 行号(取值范围0-24),(dl)=列号(取值范围0-79);(cl)=颜色
23、,ds:si指向字符串的首地址;*assume cs:code,ds:data,es:display,ss:stackdata segment db welcome to masm!,0data endsstack segment db 8 dup(0)stack ends display segment db 1024 dup(0)display endscode segmentstart: mov dh,8 mov dl,3 mov cl,2 mov ax,data mov ds,ax mov si,0 call show_str mov ax,4c00h int 21h;*;显示字符串的子程序;*
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1