汇编语言课后习题解答
- 格式:doc
- 大小:320.00 KB
- 文档页数:32
习题一1 分别将下列二进制数作为无符号数和带符号数转换为十进制和十六进制数11010011,01110111,10000011,00101111 ,10101010查看正确答案无符号数: 11010011=211=D3H,01110111=119=77H,10000011=131=83H,00101111=47=2FH,10101010=170=AAH带符号数:11010011= -45=D3H,01110111=+119=77H,10000011= -125=83H,00101111=+47=2FH,10101010= -86=AAH2 十六进制运算1A52H+4438H ,3967H-2D81H,37H×12H ,1250H×4H查看正确答案5E8AH,0BE6H,3DEH,4940H3 将十进制数变为8位补码,做运算(结果用二进制、十六进制、十进制表示)29+53,73-24,-66+82 ,-102-15查看正确答案00011101+00110101=01010010=52H=8201001001+11101000=00110001=31H=4910111110+01010010=00010000=10H=1610011010+11110001=10001011=8BH= -1174 用压缩BCD码计算(结果用二进制、BCD码、十进制表示)29+53,73-24,66+18 ,132+75查看正确答案00101001+01010011=01111100+00000110=10000010=82H=8201110011-00100100=01001111-00000110=01001001=49H=4901100110+00011000=01111110+00000110=10000100=84H=84 0000000100110010+01110101=0000000110100111+00000110=0000001000000111=0207H=2075 符号位扩展(字节扩展为字,字扩展为双字)20A3H,94H ,3456H ,7FH ,EC00H查看正确答案000020A3H,FF94H,00003456H,007FH,FFFFEC00H6 若机器字长为16位,其无符号数表示范围是多少?带符号数表示范围是多少?分别用十进制和十六进制表示。
汇编语言程序设计第四版【课后习题答案】第1章汇编语言基础知识〔习题1.1〕简述计算机系统的硬件组成及各部分作用。
〔解答〕CPU:包括运算器、控制器和寄存器组。
运算器执行所有的算术和逻辑运算;控制器负责把指指令逐条从存储器中取出,经译码分析后向机器发出各种控制命令,并正确完成程序所要求的功能;寄存器组为处理单元提供所需要的数据。
存储器:是计算机的记忆部件,它用来存放程序以及程序中所涉及的数据。
外部设备:实现人机交换和机间的通信。
〔习题1.2〕明确下列概念或符号:主存和辅存,RAM和ROM,存储器地址和I/O端口,KB、MB、GB和TB。
〔解答〕主存又称内存是主存储器的简称,主存储器存放当前正在执行的程序和使用的数据,CPU可以直接存取,它由半导体存储器芯片构成其成本高、容量小、但速度快。
辅存是辅助存储器的简称,辅存可用来长期保存大量程序和数据,CPU需要通过I/O接口访问,它由磁盘或光盘构成,其成本低、容量大,但速度慢。
RAM是随机存取存储器的英语简写,由于CPU可以从RAM读信息,也可以向RAM写入信息,所以RAM也被称为读写存储器,RAM型半导体存储器可以按地址随机读写,但这类存储器在断电后不能保存信息;而ROM中的信息只能被读出,不能被修改,ROM型半导体通常只能被读出,但这类存储器断电后能保存信息。
存储器由大量存储单元组成。
为了区别每个单元,我们将它们编号,于是,每个存储单元就有了一个存储地址,I/O接口是由一组寄存器组成,为了区别它们,各个寄存器进行了编号,形成I/O地址,通常称做I/O端口。
KB是千字节、MB是兆字节、GB是吉字节和TB是太字节,它们都是表示存储器存储单元的单位。
〔习题1.3〕什么是汇编语言源程序、汇编程序、目标程序?〔解答〕用汇编语言书写的程序就称为汇编语言源程序;完成汇编工作的程序就是汇编程序;由汇编程序编译通过的程序就是目标程序。
〔习题1.4〕汇编语言与高级语言相比有什么优缺点?〔解答〕汇编语言与高级语言相比的优点:由于汇编语言本质就是机器语言,它可以直接地、有效地控制计算机硬件,因而容易产生运行速度快,指令序列短小的高效目标程序,可以直接控制计算机硬件部件,可以编写在“时间”和“空间”两方面最有效的程序。
补全编程,利用jcxz指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。
assume cs:codecode segmentstart: mov ax,2000hmov ds,axmov bx,0s: mov ch,0mov cl,[bx]jcxz ok ;当cx=0时,CS:IP指向OKinc bxjmp short sok: mov dx,bxmov ax ,4c00hint 21hcode endsend start检测点9.3补全编程,利用loop指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。
assume cs:codecode segmentstart: mov ax,2000hmov ds,axmov bx,0s:mov cl,[bx]mov ch,0inc cxinc bxloop sok:dec bxmov dx,bxmov ax,4c00hint 21hcode endsend start书P101,执行loop s时,首先要将(cx)减1。
“loop 标号”相当于dec cxif((cx)≠0) jmp short 标号检测点10.1补全程序,实现从内存1000:0000处开始执行指令。
assume cs:codestack segmentdb 16 dup (0)stack endscode segmentstart: mov ax,stackmov ss,axmov sp,16mov ax, 1000hmov ax, 0push axretfcode endsend start执行reft指令时,相当于进行:pop ippop cs根据栈先进后出原则,应先将段地址cs入栈,再将偏移地址ip入栈。
检测点10.3下面的程序执行后,ax中的数值为多少?内存地址机器码汇编指令执行后情况1000:0 b8 00 00 mov ax,0 ax=0,ip指向1000:31000:3 9a 09 00 00 10 call far ptr s pop cs,pop ip,ip指向1000:91000:8 40 inc ax1000:9 58 s:pop ax ax=8hadd ax,ax ax=10hpop bx bx=1000hadd ax,bx ax=1010h用debug进行跟踪确认,“call far ptr s”是先将该指令后的第一个字节段地址cs=1000h入栈,再将偏移地址ip=8h入栈,最后转到标号处执行指令。
新版汇编语言程序设计【课后习题答案】第1章汇编语言基础知识〔习题1.1〕简述计算机系统的硬件组成及各部分作用。
〔解答〕CPU:包括运算器、控制器和寄存器组。
运算器执行所有的算术和逻辑运算;控制器负责把指指令逐条从存储器中取出,经译码分析后向机器发出各种控制命令,并正确完成程序所要求的功能;寄存器组为处理单元提供所需要的数据。
存储器:是计算机的记忆部件,它用来存放程序以及程序中所涉及的数据。
外部设备:实现人机交换和机间的通信。
〔习题1.2〕明确下列概念或符号:主存和辅存,RAM和ROM,存储器地址和I/O端口,KB、MB、GB和TB〔解答〕主存又称内存是主存储器的简称,主存储器存放当前正在执行的程序和使用的数据,CPU 可以直接存取,它由半导体存储器芯片构成其成本高、容量小、但速度快。
辅存是辅助存储器的简称,辅存可用来长期保存大量程序和数据,CPU需要通过I/O接口访问,它由磁盘或光盘构成,其成本低、容量大,但速度慢。
RAM是随机存取存储器的英语简写,由于CPU可以从RAM读信息,也可以向RAM写入信息,所以RAM也被称为读写存储器,RAM型半导体存储器可以按地址随机读写,但这类存储器在断电后不能保存信息;而ROM中的信息只能被读出,不能被修改,ROM型半导体通常只能被读出,但这类存储器断电后能保存信息。
存储器由大量存储单元组成。
为了区别每个单元,我们将它们编号,于是,每个存储单元就有了一个存储地址,I/O接口是由一组寄存器组成,为了区别它们,各个寄存器进行了编号,形成I/O地址,通常称做I/O端口。
KB是千字节、MB是兆字节、GB是吉字节和TB是太字节,它们都是表示存储器存储单元的单位。
〔习题1.3〕什么是汇编语言源程序、汇编程序、目标程序?〔解答〕用汇编语言书写的程序就称为汇编语言源程序;完成汇编工作的程序就是汇编程序;由汇编程序编译通过的程序就是目标程序。
〔习题1.4〕汇编语言与高级语言相比有什么优缺点?〔解答〕汇编语言与高级语言相比的优点:由于汇编语言本质就是机器语言,它可以直接地、有效地控制计算机硬件,因而容易产生运行速度快,指令序列短小的高效目标程序,可以直接控制计算机硬件部件,可以编写在“时间”和“空间”两方面最有效的程序。
(完整版)第1章_汇编语言基础习题答案第1章汇编语言基础1.1 简答题(1)哪个处理器的指令系统成为Intel 80x86系列处理器的基本指令集?8086(2)ROM-BIOS 是什么?ROM-BIOS是固化在只读存储器中的基本输入输出系统,是PC 软件系统最低层的程序。
(3)什么是通用寄存器?一般指处理器最常使用的整数寄存器,可用于保存整数数据、地址等(4)堆栈的存取原则是什么?采用先进后出FILO或者后进先出LIFO的操作方式。
(5)标志寄存器主要保存哪方面的信息?用于反映指令执行结果或控制指令执行形式。
(6)最高有效位MSB是指哪一位?数据的最高位,例如对8、16、32位数据,MSB依次指D7、D15和D31位(7)汇编语言中的标识符与高级语言的变量和常量名的组成原则有本质的区别吗?没有(8)汇编语言的标识符大小写不敏感意味着什么?表示字母大小写不同、但表示同一个符号(9)在汇编语言源程序文件中,END语句后的语句会被汇编吗?不会(10)汇编时生成的列表文件主要包括哪些内容?主要包含源程序和目标代码。
1.2 判断题1)EAX也被称为累加器,因为它使用最频繁。
对,EAX中的A来自英文累加器(Accumulator)6)处理器的传送指令MOV属于汇编语言的执行性语句对7)汇编语言的语句由明显的4部分组成,不需要分隔符区别。
错,使用了分隔符才有了明显的4部分8)MASM汇编语言的注释用分号开始,不能用中文分号对,源程序中的分隔符以及各种标识符都是英文9)程序终止执行也就意味着汇编结束,所以两者含义相同。
错,两者完全是两个概念1.3 填空题(1)Intel 8086支持( ) 容量主存空间,IA-32处理器支持( ) 容量主存空间。
1MB ,4GB(2)Intel ( ) 处理器将80x86指令系统升级为32位指令系统,()处理器内部集成浮点处理单元、开始支持浮点操作指令。
80386,80486(3)IA-32处理器有8个32位通用寄存器,其中EAX,(),( )和EDX,可以分成16位和8位操作;还有另外4个是( ),( ),( ),和( )。
第一章. 习题1.1 用降幂法和除法将下列十进制数转换为二进制数和十六进制数:(1) 369 (2) 10000 (3) 4095(4) 32767答:(1) 369=1 0111 0001B=171H(2) 10000=10 0111 0001 0000B=2710H(3) 4095=1111 1111 1111B=FFFH(4) 32767=111 1111 1111 1111B=7FFFH1.2 将下列二进制数转换为十六进制数和十进制数:(1) 10 1101 (2) 1000 0000 (3) 1111 1111 1111 1111 (4) 11111111答:(1) 10 1101B=2DH=45(2) 1000 0000B=80H=128(3) 1111 1111 1111 1111B=FFFFH=65535(4) 1111 1111B=FFH=2551.3 将下列十六进制数转换为二进制数和十进制数:(1) FA (2) 5B (3) FFFE(4) 1234答:(1) FAH=1111 1010B=250(2) 5BH=101 1011B=91(3) FFFEH=1111 1111 1111 1110B=65534(4) 1234H=1 0010 0011 0100B=46601.4 完成下列十六进制数的运算,并转换为十进制数进行校核:(1) 3A+B7 (2) 1234+AF (3) ABCD-FE(4) 7AB×6F答:(1) 3A+B7H=F1H=241(2) 1234+AFH=12E3H=4835(3) ABCD-FEH=AACFH=43727(4) 7AB×6FH=35325H=2178931.5 下列各数均为十进制数,请用8位二进制补码计算下列各题,并用十六进制数表示其运算结果。
(1) (-85)+76 (2) 85+(-76) (3) 85-76 (4) 85-(-76) (5) (-85)-76 (6) -85-(-76)答:(1) (-85)+76=1010 1011B+0100 1100B=1111 0111B=0F7H;CF=0;OF=0(2) 85+(-76)=0101 0101B+1011 0100B=0000 1001B=09H;CF=1;OF=0(3) 85-76=0101 0101B-0100 1100B=0101 0101B+1011 0100B=0000 1001B=09H;CF=0;OF=0(4) 85-(-76)=0101 0101B-1011 0100B=0101 0101B+0100 1100B=10100001B=0A1H;CF=0;OF=1(5) (-85)-76=1010 1011B-0100 1100B=1010 1011B+1011 0100B=0101 1111B=5FH;CF=0;OF=1(6) -85-(-76)=1010 1011B-1011 0100B=1010 1011B+0100 1100B=11110111B=0F7H;CF=0;OF=01.6 下列各数为十六进制表示的8位二进制数,请说明当它们分别被看作是用补码表示的带符号数或无符号数时,它们所表示的十进制数是什么?(1) D8 (2) FF答:(1) D8H表示的带符号数为-40,D8H表示的无符号数为216;(2) FFH表示的带符号数为-1,FFH表示的无符号数为255。
2.1已知DS=2000H、BX=0100H、SI=0002H,存储单元[20100H]~[20103H]依次存放12 34 56 78H,[21200H]~[21203H]依次存放2A 4C B7 65H,说明下列每条指令执行完后AX寄存器的内容。
(1)mov ax,1200h(2)mov ax,bx(3)mov ax,[1200h](4)mov ax,[bx](5)mov ax,[bx+1100h](6)mov ax,[bx+si](7)mov ax,[bx][si+1100h]〔解答〕(1)AX=1200H(2)AX=0100H(3)AX=4C2AH ;偏移地址=bx=0100h(4)AX=3412H ;偏移地址=bx=0100h(5)AX=4C2AH ;偏移地址=bx+1100h=1200h(6)AX=7856H ;偏移地址=bx+si=0100h+0002h=0102h(7)AX=65B7H ;偏移地址=bx+si+1100h=0100h+0002h+1100h=1202h〔习题2.2〕指出下列指令的错误(1)mov cx,dl(2)mov ip,ax(3)mov es,1234h(4)mov es,ds(5)mov al,300(6)mov [sp],ax(7)mov ax,bx+di(8)mov 20h,ah〔解答〕(1)两操作数类型不匹配(2)IP指令指针禁止用户访问(3)立即数不允许传给段寄存器(4)段寄存器之间不允许传送(5)两操作数类型不匹配(6)目的操作数应为[ SI ](7)源操作数应为[BX+DI](8)立即数不能作目的操作数〔习题2.5〕已知SS = 2200H、SP = 00B0H,画图说明执行下面指令序列时,堆栈区和SP的内容如何变化?mov ax,8057hpush axmov ax,0f79hpush axpop bxpop [bx]〔解答〕mov ax,8057hpush axmov ax,0f79hpush axpop bx ;bx=0f79hpop [bx] ;DS:[0f79h]=8057h〔习题2.6〕给出下列各条指令执行后AL值,以及CF、ZF、SF、OF和PF的状态:mov al,89hadd al,aladd al,9dhcmp al,0bchsub al,aldec alinc al〔解答〕mov al,89h ; AL=89h CF ZF SF OF PFadd al,al ; AL=12h 1 0 0 1 1; 1000 1001+1000 100110001 0010add al,9dh ; AL=0afh 0 0 1 0 1; 0001 0010+ 1001 11011010 1111cmp al,0bch ; AL=0afh 1 0 1 0 1; 1010 1111-1011 1100* 0100 0011sub al,al ; AL=00h 0 1 0 0 1dec al ; AL=0ffh 0 0 1 0 1 ; 0000 0000- 0000 0001*1111 1111inc al ; AL=00h 0 1 0 0 1 ;1111 1111+0000 0001*1111 1111必考:〔习题2.10〕指出下列指令的错误:(1)xchg [si],30h (2)pop cs(3)sub [si],[di](4)push ah(5)adc ax,ds(6)add [si],80h(7)in al,3fch(8)out dx,ah〔解答〕(1)xchg的操作数不能是立即数(2)不应对CS直接赋值(3)两个操作数不能都是存储单元(4)堆栈的操作数不能是字节量(5)adc的操作数不能是段寄存器(6)没有确定是字节还是字操作(7)in不支持超过FFH的直接寻址(8)out只能以AL/AX为源操作数〔习题2.11〕给出下列各条指令执行后的结果,以及状态标志CF、OF、SF、ZF、PF的状态。
第一章基础知识1、用降幂法和除法将下列十进制数转换为二进制数和16进制数。
(1)369 (2)10000 (3)4095 (4)32767答案:(1)1,0111L,0001B;171H (3)1111,1111,1111B1;9FFFH2、将下列二进制数转换为16进制数和十进制效,(1)101101 (2)10000000 (3)]111111********* (4)111111答案:(1)2DH;45D (3)0FFFFH;65535D3、将下列16进制数转换为二进制数和十进制数。
(1)FA (2)5B (3)FFFE (4)12D4答案:(1)1111,1010B;250D (3)1111,1111,1111,1110B;65534D5、下列各数均为十进制数,请用8位二进制补码计算下列各题,并用16进制数表示其运算结果。
(1)(一85)十76 (2)85十(一76) (3)85—76(4)85一(一76) (5)(一85)一76 (6)(一85)一(一76)答案:(1)0F7H (2)9H (4)0A1H (5)5FH (6)0F7H7、下列各数均为用16进制表示的8位二进制数,请说明当它们分别被看作是用补码表示的数或字符的ASCII码时,它们所表示的十进制及字符是什么?(1)4F (2)2B (3)73 (4)59答案:(1)79D; O(大写)(2)43D; +(3)115D;s(小写)(4)89D; Y8、请写出下列字符串的ACSII码。
For example,This is a number 3692.答案46 6F 72 20 65 78 61 6D 70 6C 65 2C 0A 0D 54 68 6973 20 69 73 20 61 20 6E 75 6D 62 65 72 20 33 36 39第二章80x86计算机组织2、有两个16位字LEE5H和2A3CH分别存放在PC机存储器的000B0H和000B3H单元中,请用图表示出它们在存储器里的存放情况。
第1章基础知识检测点1.1(第9页)(1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为13位。
(2)1KB的存储器有1024个存储单元,存储单元的编号从0到1023。
(3)1KB的存储器可以存储8192(2^13)个bit,1024个Byte。
(4)1GB是1073741824(2^30)个Byte、1MB是1048576(2^20)个Byte、1KB是1024(2^10)个Byte。
(5)8080、8088、80296、80386的地址总线宽度分别为16根、20根、24根、32根,则它们的寻址能力分别为: 64(KB)、1(MB)、16(MB)、4(GB)。
(6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。
则它们一次可以传送的数据为: 1(B)、1(B)、2(B)、2(B)、4(B)。
(7)从内存中读取1024字节的数据,8086至少要读512次,80386至少要读256次。
(8)在存储器中,数据和程序以二进制形式存放。
解题过程:(1)1KB=1024B,8KB=1024B*8=2^N,N=13。
(2)存储器的容量是以字节为最小单位来计算的,1KB=1024B。
(3)8Bit=1Byte,1024Byte=1KB(1KB=1024B=1024B*8Bit)。
(4)1GB=1073741824B(即2^30)1MB=1048576B(即2^20)1KB=1024B(即2^10)。
(5)一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N。
这样的CPU最多可以寻找2的N次方个内存单元。
(一个内存单元=1Byte)。
(6)8根数据总线一次可以传送8位二进制数据(即一个字节)。
(7)8086的数据总线宽度为16根(即一次传送的数据为2B)1024B/2B=512,同理1024B/4B=256。
(8)在存储器中指令和数据没有任何区别,都是二进制信息。
第2章寄存器检测点2.1(第19页)(1)写出每条汇编指令执行后相关寄存器中的值。
第一空:F4A3H第二空:31A3H第三空:3123H第四空:6246H第五空:826CH第六空:6246H第七空:826CH第八空:04D8H第九空:0482H第十空:6C82H第十一空:D882H第十二空:D888H第十三空:D810H第十四空:6246H(2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。
解答如下:mov ax,2add ax,axadd ax,axadd ax,ax检测点2.2(第25页)(1)00010H,1000FH(2)1001H,2000H第2题说明:因为段的起始地址要为16的倍数。
所以当段地址小于1001H或大于2000H时CPU都无法寻到。
(1)解题过程:物理地址=SA*16+EAEA的变化范围为0h~ffffh物理地址范围为(SA*16+0h)~(SA*16+ffffh)现在SA=0001h,那么寻址范围为(0001h*16+0h)~(0001h*16+ffffh)=0010h~1000fh(2)解题过程:物理地址=SA*16+EA20000h=SA*16+EASA=(20000h-EA)/16=2000h-EA/16EA取最大值时,SA=2000h-ffffh/16=1001h,SA为最小值EA取最小值时,SA=2000h-0h/16=2000h,SA为最大值这里的ffffH/16=fffh是通过WIN自带计算器算的按位移来算确实应该为fff.fh,这里小数点后的f应该是省略了单就除法来说,应有商和余数,但此题要求的是地址最大和最小,所以余数忽略了如果根据位移的算法(段地址*16=16进制左移一位),小数点后应该是不能省略的我们可以反过来再思考下,如果SA为1000h的话,小数点后省略SA=1000h,EA取最大ffffh,物理地址为1ffffh,将无法寻到20000H单元这道题不应看成是单纯的计算题检测点2.3(第35页)答:CPU修改了4次IP的值。
情况如下:第1次:执行完mov ax,bx后第2次:执行完sub ax,ax后 ;该步执行后,寄存器ax清零第3次:读入jmp ax后第4次:执行完jmp ax后;连续两步ip均为0最后IP的值为0;最后IP的值为0000H,因为最后ax中的值为0000H,所以IP中的值也为0000H第三章寄存器(内存访问)检测点3.1(第55页)(1)(题目:略)第一空:2662H第二空:E626H第三空:E626H第四空:2662H第五空:D6E6H第六空:FD48H第七空:2C14H第八空:0000H第九空:00E6H第十空:0000H第十一空:0026H第十二空:000CH提示:此题可在DEBUG中利用E命令在本机上按照题目中所给出的内存单元及其数据进行相应地修改,然后再用A命令进行写入(题目中所给出的)相应的汇编指令,最后再进行T命令进行逐步执行,以查看相应结果。
(2)指令序列如下:mov ax,6622hjmp 0ff0:0100mov ax,2000hmov ds,axmov ax,[0008]mov ax,[0002]2.写出CPU执行每条指令后,CS、IP和相关寄存器中的数值。
指令序列↓寄存器→CS IP DS AX BX 初始值→2000H00001000H00mov ax,6622h2000H00031000H6622H0000jmp 0ff0:01001000H00001000H6622H0000 mov ax,2000h1000H00031000H2000H0000 mov ds,ax1000H00052000H2000H0000 mov ax,[0008]1000H00082000H C389H0000 mov ax,[0002]1000H000B2000H EA66H00003.再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?检测点3.2(第70页)(1)补全下面的程序,使其可以将10000H-1000FH中的8个字,逆序拷贝到20000H-2000FH 中。
mov ax,1000Hmov ds,axmov ax,2000Hmov ss,axmov sp,10h(2)补全下面的程序,使其可以将10000H-1000FH中的8个字,逆序拷贝到20000H-2000FH 中。
mov ax,2000Hmov ds, axmov ax,1000Hmov ss, axmov sp,0检测点6.1(第129页)(1)下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,完成程序:assume cs:codesgcodesg segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hstart: mov ax,0mov ds, axmov bx,0mov cx,8s: mov ax,[bx]mov cs:[bx],axadd bx,2loop smov ax,4c00hint 21hcodesg endsend start(2)下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,数据的传送用栈来进行。
栈空间设置在程序内。
完成程序:assume cs:codesgcodesg segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdw 0,0,0,0,0,0,0,0,0,0;10个字单元用作栈空间,所以栈空间的大小为10*2=20,化成16进制即为14 start: mov ax, codesg;或mov ax, csmov ss ,axmov sp, 24h ;或mov sp, 36;10h+14h=24hmov ax,0mov ds, axmov bx,0mov cx,8s: push [bx]pop cs:[bx] ;或 pop ss:[bx] ;关键在于cs与ss此时地址相同add bx,2loop smov ax,4c00hint 21hcodesg endsend start检测点9.1(第183页)(1)程序如下:assume cs:codedata segmentdw 2 dup (0)data endscode segmentstart: mov ax, datamov ds, axmov bx,0jmp word ptr [bx+1]code endsend start若要使jmp指令执行后,CS:IP指向程序的第一条指令,在data段中应该定义哪些数据?答案①db 3 dup (0)答案②dw 2 dup (0)答案③dd 0jmp word ptr [bx+1]为段内转移,要CS:IP指向程序的第一条指令,应设置ds:[bx+1]的字单元(2个字节)存放数据应为0,则(ip)=ds:[bx+1]=0简单来说就是,只要ds:[bx+1]起始地址的两个字节为0就可以了(2)程序如下:assume cs:codedata segmentdd 12345678hdata endscode segmentstart: mov ax,datamov ds,axmov bx,0mov [bx], bx ;或mov [bx], word ptr 0 ;或mov [bx], offset start mov [bx+2], cs ;或mov [bx+2], cs ;或mov [bx+2], seg codejmp dword ptr ds:[0]code endsend start补全程序,使用jmp指令执行后,CS:IP指向程序的第一条指令。
第一格可填①mov [bx],bx ②mov [bx],word ptr 0 ③mov [bx],offset start等。
第二格可填①mov [bx+2],cs ②mov [bx+2],cs ③mov [bx+2],seg code等。
解析:jmp dword ptr ds:[0]为段间转移,(cs)=(内存单元地址+2),(ip)=(内存单元地址),要CS:IP 指向程序的第一条指令,第一条程序地址cs:0,应设置CS:IP指向cs:0程序中的mov [bx],bx这条指令,是将ip设置为0mov [bx+2],cs,将cs这个段地址放入内存单元执行后,cs应该不变,只调整ip为0,(ip)=ds:[0]=0(3)用Debug查看内存,结果如下:2000:1000 BE 00 06 00 00 00 ......则此时,CPU执行指令:mov ax,2000hmov es,axjmp dword ptr es:[1000h]后,(cs)= 0006H,(ip)= 00BEH解析:jmp dword ptr为段间转移,高位存放段地址,低位存放偏移地址(cs)=(内存单元地址+2),(ip)=(内存单元地址)根据书P16,对于寄存器AX,AH为高位(前1字节为高位),AL为低位(后1字节为低位)推算出(内存单元地址)=00BEH,(内存单元地址+2)=0006H根据书P182,高位存放段地址(后2个字节为高位),低位存放偏移地址(前2个字节为低位) (cs)=(内存单元地址+2),(ip)=(内存单元地址)推算出(cs)=0006H,(ip)=00BEH.检测点9.2(第184页)补全编程,利用jcxz指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。