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第十二空:D888
2、H第十三空: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第十二空:000CH注
3、意: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 0000 mov
4、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做出来的结果会不一样,在加之数据太多,我做了两次数据都没有完整的记下来,只好作罢!实验四: bx和loop的使
6、用(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月19日01:1
7、1:00 | 评论( 2 ) | 编辑| 举报| 收藏 旧一篇:常用命令(转) | 新一篇:实验五: 编写、调试具有多个段的程序 Copyright maokaijiang Powered by CSDN Blog 十一川藏疯狂之旅 本文来自CSDN博客,转载请标明出处:王爽汇编语言答案(本答案是自己做的 所有题目已在deubg中调试;但难免有差错,发现的提醒我 email:maokaijiang1211 谢谢) (1) 1931(一直保持不变,由于pc不同 答案有可能不一样)cs=1943 ss=1941 ds=1931 (由于pc不同,所以答案也可能不同,这只是机子上的数据)第一空:X2
8、第二空: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 mov es,a
9、x 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数据,逆序存储到b段中;*ass
10、ume 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 段中的每个单词的前四个字母改写为大写字母;*ass
11、ume 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: mov al
12、,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,1994,199
13、5 ;以上是表示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年公司雇员人数的21个wo
14、rd型数据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;*;把收入送到t
15、able中;* 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博客,转载请标明出处: 第九章 收藏 检测点9.1 (1
16、)程序如下: 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:1000中的内
17、容写为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 21hstart: mov
19、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,ss:stac
20、kdata 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 mov bx,0
21、;*;做上六次内循环,将数据段定义的字符串写入内存中;* 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是ip的值为6 接着
22、进栈,然后执行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)=颜色,ds:si指向
23、字符串的首地址;*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;*;显示字符串的子程序;*sho
24、w_str: push cx push si mov ax,0B800H mov es,ax mov al,0a0h dec dh mul dh mov bx,ax mov al,2 mul dl sub dl,2 add bx,ax ;得到偏移地址=(dh-1)*160+dl*2-2 mov di,0 mov ch,0 mov al,cl s: mov cl,ds:si jcxz next ;进行判断最后一个字符是否是零,如果是零则结束 mov es:bx+di,cl ;将字符串放到偶地址中 mov es:bx+di+1,al ;颜色属性放到奇地址中 add di,2 inc si jmp
25、snext: pop si pop cx retcode ends end start注意:子程序中用到的寄存器一定要将其保存起来,注意参数的传递!,只要程序中要进栈和出栈,就一定要定义堆栈段!2.解决除法溢出问题 ;*;解决除法溢出问题,;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数;*assume cs:code,ss:stackstack segment dw 8 dup(0)stack endscode segmentstart: mov ax,stack mo
26、v ss,ax mov sp,10h mov ax,4240h mov dx,0fh mov cx,0ah call divdw mov ax,4c00h int 21hdivdw: ;子程序定义开始 push ax mov ax,dx mov dx,0 div cx mov bx,ax pop ax div cx mov cx,dx mov dx,bx ;dx:ax/cx=高位的商*65536+高位的余数*65536+低位/cx ret ;子程序定义结束code endsend start3.数值显示子程序 ;*;数值显示子程序;编程,将data段中的数据以十进制的形式显示出来;*assum
27、e cs:code,ds:datadata segment db 10 dup(0)data endscode segmentstart: mov ax,12666 mov bx,data mov ds,bx mov si,0 call dtoc mov dh,8 mov dl,3 mov cl,2 call show_str mov ax,4c00h int 21h;*;将word型的数据转变为十进制数字符串的子程序;*dtoc: push ax push si push dx push cx push bx mov bx,0 s0: mov cx,10d mov dx,0 div cx mov cx,ax ;将商放到cx中判断商是否为零 jcxz s1 add dx,30h push dx inc bx jmp s0s1: add dx,30h push dx inc bx mov cx,bx mov si,0s2: pop ax mov ds:si,al inc si loop s2 pop bx pop cx pop dx pop si pop ax ret;*;显示字符串子程序;*