mov 汇编ss:[2],cs什么意思?求详解

MOV BX,1000H在汇编语言中,这条数据传输指令时什么意思_百度知道
MOV BX,1000H在汇编语言中,这条数据传输指令时什么意思
16进制数据1000放入寄存器bx
那个H就是16进制的意思么?那16进制数1000是多少?
那个H就是16进制的意思,具体进制的含义建议你买本书看。或者在网上搜一下相关知识。比如:《IBM-PC 汇编语言程序设计》清华出版的。可以找一下电子版的。
其他类似问题
按默认排序
其他3条回答
IBM PC微机符号数(B) A. BCD码B.补C.倒D.
2汇编目标代码程序源代码打包BCD工艺(A) /& A.编译B.编辑C.编辑D.连接 3数据传输指令错误操作(D) A. MOV SS:[BX + DI]<img class="word-replace" src="/api/getdecpic?picenc=0ad00H
BR /& B. MOV DX<img class="word-replace" src="/api/getdecpic?picenc=0ad00H
C. MOV WORD PTR [BX]<img class="word-replace" src="/api/getdecpic?picenc=0ad00H
D. MOV DS<img class="word-replace" src="/api/getdecpic?picenc=0ad00H
4执行面指令内容变量DAB(0F5H) DAW DW2A05H
DAB DB 0FAH : MOV ALBYTE PRT DAW
A. 0DAH乙0FAH C. 0F5H D. 0D0H
5执行面汇编语言指令其结确(B) MOV AL<img class="word-replace" src="/api/getdecpic?picenc=0ad0
MOV BL-2 答:AL = 100H BL = 02H B. AL = 64H BL = 0FEH
C. AL = 64H BL = 82H D. AL = 100H BL = 0FEH
1十六进制转换:(问题乱七八糟知道问) 0100110 B = 38D 8E3.AH = D
998 D = 3E6?235.25e= __ 353.2____B2数字X真价值:-1001101 0表示数1表示负号
[X]补= __ BCD码二进制形式十进制数表示物种提 4 写8086CPU各种内部寄存器: AH / AL:AX高/低8累加器寄存器 BH / BL:BX高/低8通用寄存器 CH / CL:CX高/低8通用寄存器用于保存计数值 DH / DL DX高/低8通用寄存器 SI:源类指数注册 DI:目标索引寄存器 BP:基址指针寄存器 SP:堆栈指针寄存器 FLAGS:标志寄存器程序状态寄存器称 IP:指令指针寄存器 CS:代码段 DS:数据段 ES附加段 5CS代码段寄存器;IP指令指针寄存器 BR /& CS:IP用于表示逻辑址指令CPU执行 6标志寄存器FR CF位叫进位标志AF位辅助进位标志控制字符串操作址增量向标志DF向标志称 7程序堆栈段数据段附加段代码段该段基别由SSDS_ESCS给 BR /& 8,8086指令操作数三种类型别:立即操作数寄存器操作数存储器操作数 9写入面指令 MOV 1000 [BP] [SI]命令使用调试环境DX 指令目操作数寻址式:相基址变址寻址模式10变量三属性:数据段偏移类型
11已知字符A<img class="word-replace" src="/api/getdecpic?picenc=0ad00001BASCII代码字符ASCII码e乙 12执行:SUB AXAXZF = 1 1(F)MOV SS标志寄存器2000H
2(T)推AH确指令PUSH BLPOP AH POP BL指令实现AH寄存器BL寄存器内容互换 3(F)指令:DIV BX执行商AL结其余AH
4(t)调试命令:D 10A8:100作用10A8:100楚始&BR / 80H字节单元内容 5(F)调试E用内容存储单元R命令其内容寄存器全面标题: 1写汇编语言程序序列设置机器细节完整程(根据自经验致包括主要步骤:编辑源文件目标文件执行文件运行程序错误检查跟踪调试)首先记事本或EDIT.EXE文件编写源代码源代码保存 asm格式使用masm.exe编译源代码缀名声 obj象代码程序编译器错误返检查源编译完用链接程序 OBJ文件链接执行exe文件程序运行结确用调试程序调试调试命令拆卸命令UT步骤执行命令
2用汇编语言编写完整程序要求:计算(W-(X * Y + Z-100)/ WWXY Z所符号数结AX供应商其余存放DX
IMUL? CX字节MOV CXAX
MOV AX于 CWD 添加CXAX
ADC BXDX CX 100
IDIV瓦特(WXY Z我16位处理数位符号数)
就是将1000H(十六进制)送给BX,BX的内容就是1000H了
BX=1000HH 十六进制
汇编语言的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁pmtest2.asm (转载) - wanghj_dz - 博客园
随笔 - 192, 文章 - 0, 评论 - 3, 引用 - 0
骑驴容易下驴难,从保护模式返回实模式就不这么容易了。&因为什么呢,先把代码拉出来看看吧。
;&==========================================;&pmtest2.asm;&编译方法:;&==========================================
%include&"pm.inc"&;&常量宏以及一些说明
org&0100h&jmp&LABEL_BEGIN&&&&&&&&&&&&&&&& //LABEL_BEGIN 程序代码运行时的入口处,是在实模式下,不需要选择子。
[SECTION&.gdt];&GDT;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&段基址段界限&&&&&属性LABEL_GDT:&&Descriptor&&&&&&&&0,&&&&&&&&&&&&&&&&&0,&0&&&&&&&;&空描述符LABEL_DESC_NORMAL:&Descriptor&&&&&&&&0,&&&&&&&&&&&&0ffffh,&DA_DRW&&;&Normal&描述符LABEL_DESC_CODE32:&Descriptor&&&&&&&&0,&&SegCode32Len&-&1,&DA_C&+&DA_32&;&非一致代码段LABEL_DESC_CODE16:&Descriptor&&&&&&&&0,&&&&&&&&&&&&0ffffh,&DA_C&&;&非一致代码段LABEL_DESC_DATA:&Descriptor&&&&&&&&0,&DataLen&-&1,&DA_DRW&&;&DataLABEL_DESC_STACK:&Descriptor&&&&&&&&0,&&&&&&&&TopOfStack,&DA_DRWA&+&DA_32&;&Stack,&32&位LABEL_DESC_TEST:&Descriptor&0500000h,&&&&&&&&&&&&0ffffh,&DA_DRWLABEL_DESC_VIDEO:&Descriptor&&0B8000h,&&&&&&&&&&&&0ffffh,&DA_DRW&&;&显存首地址;&GDT&结束
GdtLen&&equ&$&-&LABEL_GDT&;&GDT长度GdtPtr&&dw&GdtLen&-&1&;&GDT界限&&dd&0&&;&GDT基地址
;&GDT&选择子SelectorNormal&&equ&LABEL_DESC_NORMAL&-&LABEL_GDTSelectorCode32&&equ&LABEL_DESC_CODE32&-&LABEL_GDTSelectorCode16&&equ&LABEL_DESC_CODE16&-&LABEL_GDT&&& //这个选择子跳转到下面的16位保护模式代码段。因为selector选择子是用在保护模式下的, 即使是16位的保护模式。SelectorData&&equ&LABEL_DESC_DATA&&-&LABEL_GDTSelectorStack&&equ&LABEL_DESC_STACK&-&LABEL_GDTSelectorTest&&equ&LABEL_DESC_TEST&&-&LABEL_GDTSelectorVideo&&equ&LABEL_DESC_VIDEO&-&LABEL_GDT;&END&of&[SECTION&.gdt]
[SECTION&.data1]&&;&数据段ALIGN&32[BITS&32]LABEL_DATA:SPValueInRealMode&dw&0 & & & & & & & & & & 用来保存实模式下sp,并在跳回实模式前重新赋值给sp;&字符串PMMessage:&&db&"In&Protect&Mode&now.&^-^",&0&;&进入保护模式后显示此字符串OffsetPMMessage&&equ&PMMessage&-&$$StrTest:&&db&"ABCDEFGHIJKLMNOPQRSTUVWXYZ",&0OffsetStrTest&&equ&StrTest&-&$$DataLen&&&equ&$&-&LABEL_DATA;&END&of&[SECTION&.data1]
;&全局堆栈段[SECTION&.gs]ALIGN&32[BITS&32]LABEL_STACK:&times&512&db&0
TopOfStack&equ&$&-&LABEL_STACK&-&1
;&END&of&[SECTION&.gs]
[SECTION&.s16]&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //这个段不需要选择子的,因为它是在实模式下。在这里要初始化段描述符的段基址。[BITS&16]LABEL_BEGIN:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//实模式下的代码&mov&ax,&cs&mov&ds,&ax&mov&es,&ax&mov&ss,&ax&mov&sp,&0100h
&mov&[LABEL_GO_BACK_TO_REAL+3],&ax & & &改写跳回实模式前代码中的jmp 0:~这句中的0。0被实模式下的cs代替。&mov&[SPValueInRealMode],&sp
&;&初始化&位代码段描述符&mov&ax,&cs&movzx&eax,&ax&shl&eax,&4&add&eax,&LABEL_SEG_CODE16&mov&word&[LABEL_DESC_CODE16&+&2],&ax&shr&eax,&16&mov&byte&[LABEL_DESC_CODE16&+&4],&al&mov&byte&[LABEL_DESC_CODE16&+&7],&ah
&;&初始化&位代码段描述符&xor&eax,&eax&mov&ax,&cs&shl&eax,&4&add&eax,&LABEL_SEG_CODE32&mov&word&[LABEL_DESC_CODE32&+&2],&ax&shr&eax,&16&mov&byte&[LABEL_DESC_CODE32&+&4],&al&mov&byte&[LABEL_DESC_CODE32&+&7],&ah
&;&初始化数据段描述符&xor&eax,&eax&mov&ax,&ds&shl&eax,&4&add&eax,&LABEL_DATA&mov&word&[LABEL_DESC_DATA&+&2],&ax&shr&eax,&16&mov&byte&[LABEL_DESC_DATA&+&4],&al&mov&byte&[LABEL_DESC_DATA&+&7],&ah
&;&初始化堆栈段描述符&xor&eax,&eax&mov&ax,&ds&shl&eax,&4&add&eax,&LABEL_STACK&mov&word&[LABEL_DESC_STACK&+&2],&ax&shr&eax,&16&mov&byte&[LABEL_DESC_STACK&+&4],&al&mov&byte&[LABEL_DESC_STACK&+&7],&ah
&;&为加载&作准备&xor&eax,&eax&mov&ax,&ds&shl&eax,&4&add&eax,&LABEL_GDT&&;&eax&&-&gdt&基地址&mov&dword&[GdtPtr&+&2],&eax&;&[GdtPtr&+&2]&&-&gdt&基地址
&;&加载&&lgdt&[GdtPtr]
&;&关中断&cli
&;&打开地址线&in&al,&92h&or&al,&b&out&92h,&al
&;&准备切换到保护模式&mov&eax,&cr0&or&eax,&1&mov&cr0,&eax
&;&真正进入保护模式&jmp&dword&SelectorCode32:0&& &//执行这一句会把&装入&并跳转到处
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LABEL_REAL_ENTRY:&&;&从保护模式跳回到实模式就到了这里&mov&ax,&cs&mov&ds,&ax&mov&es,&ax&mov&ss,&ax
&mov&sp,&[SPValueInRealMode]
&in&al,&92h&&;&┓&and&al,&b&;&┣&关闭&地址线&out&92h,&al&&;&┛
&sti&&&;&开中断
&mov&ax,&4c00h&;&┓&int&21h&&;&┛回到&
;&END&of&[SECTION&.s16]&&&&&&&&&&&&&&//返回到实模式下完成回到DOS的功能&&&&&&&&&&&&&&&
[SECTION&.s32];&32&位代码段由实模式跳入[BITS&32]
LABEL_SEG_CODE32:&mov&ax,&SelectorData&mov&ds,&ax&&&;&数据段选择子&mov&ax,&SelectorTest&mov&es,&ax&&&;&测试段选择子&mov&ax,&SelectorVideo&mov&gs,&ax&&&;&视频段选择子
&mov&ax,&SelectorStack&mov&ss,&ax&&&;&堆栈段选择子
&mov&esp,&TopOfStack
&;&下面显示一个字符串&mov&ah,&0Ch&&&;&0000:&黑底&&&&红字&xor&esi,&esi&xor&edi,&edi&mov&esi,&OffsetPMMessage&;&源数据偏移&mov&edi,&(80&*&10&+&0)&*&2&;&目的数据偏移。屏幕第&行第&列。&cld.1:&lodsb&test&al,&al&jz&.2&mov&[gs:edi],&ax&add&edi,&2&jmp&.1.2:&;&显示完毕
&call&DispReturn
&call&TestRead&call&TestWrite&call&TestRead
&;&到此停止&jmp&SelectorCode16:0&&&&&&&&&&&&&&&&&&&&&& //跳转到16位代码的保护模式,需要选择子。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//同时完成对CS高速缓冲寄存器的段属性和段界限的赋值,使之符合实模式要求
;-------------------------------------------------------------------------;&------------------------------------------------------------------------以下为函数(子程序)定义TestRead:&xor&esi,&esi&mov&ecx,&8.loop&mov&al,&[es:esi]&call&DispAL&inc&esi&loop&.loop
&call&DispReturn
&ret;&TestRead&结束
;&------------------------------------------------------------------------TestWrite:&push&esi&push&edi&xor&esi,&esi&xor&edi,&edi&mov&esi,&OffsetStrTest&;&源数据偏移&cld.1:&lodsb&test&al,&al&jz&.2&mov&[es:edi],&al&inc&edi&jmp&.1.2:
&pop&edi&pop&esi
&ret;&TestWrite&结束
;&------------------------------------------------------------------------;&显示&中的数字;&默认地;&数字已经存在&中;&edi&始终指向要显示的下一个字符的位置;&被改变的寄存器;&ax,&edi;&------------------------------------------------------------------------DispAL:&push&ecx&push&edx&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//push主要看看那些要用到,那些要xor,循环用的ecx一般都要push
&mov&ah,&0Ch&&&;&0000:&黑底&&&&红字&mov&dl,&al&shr&al,&4&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //先对al的高4位处理&mov&ecx,&2&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .begin:&and&al,&01111b&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//第二次循环处理al的低四位&cmp&al,&9&ja&.1&add&al,&'0'&jmp&.2.1:&sub&al,&0Ah &add&al,&'A'.2:&mov&[gs:edi],&ax&add&edi,&2
&mov&al,&dl&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//要处理al的低四位&loop&.begin&add&edi,&2
&pop&edx&pop&ecx
&ret;&DispAL&结束
;&------------------------------------------------------------------------DispReturn:&push&eax&push&ebx&mov&eax,&edi&mov&bl,&160&div&bl&and&eax,&0FFh&inc&eax&mov&bl,&160&mul&bl&mov&edi,&eax&pop&ebx&pop&eax
&ret;&DispReturn&结束;-------------------------------------------------------------函数定义结束
SegCode32Len&equ&$&-&LABEL_SEG_CODE32;&END&of&[SECTION&.s32]
;&16&位代码段由&位代码段跳入跳出后到实模式[SECTION&.s16code]ALIGN&32[BITS&16]LABEL_SEG_CODE16:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//16位代码保护模式,需要选择子SelectorCode16跳转到这儿,在这里主要是从新跳回到实模式。&;&跳回实模式&mov&ax,&SelectorNormal&&&&&&&&&&&&&&//通过符合实模式段属性,段界限的选择子SelectorNormal,对个寄存器的高速缓存重新赋值,使之符合实模式的状态&mov&ds,&ax&mov&es,&ax&mov&fs,&ax&mov&gs,&ax&mov&ss,&ax
&mov&eax,&cr0&and&al,&b&mov&cr0,&eax
LABEL_GO_BACK_TO_REAL:&jmp&0:LABEL_REAL_ENTRY&;&段地址会在程序开始处被设置成正确的值&& //通过实模式下的跳转,完成对CS的赋值
Code16Len&equ&$&-&LABEL_SEG_CODE16&//对上句应由LABEL_REAL_ENTRY这个门牌号,推测到那个街道号LABEL_BEGIN。街道号,门牌号好
;&END&of&[SECTION&.s16code]&&&&&&&&&&&&&&//发现保护模式下的编程很清楚,大量运用[section .!!!]来间隔代码,通过选择子完成各section之间的跳转。;注:这个代码是建立在原来代码基础上的,原本没这么长。
首先我不得不先强调一下保护模式的实质:在保护模式中,任何地址都要换算成基址偏移的形式,也即任何地址的确定都要依靠该地址与指定段基址之间的差值,之后再将该基地址通过描述符映射为更广区域的物理地址。如果已知我们已经在单纯的模式下,那么我们可以直接通过诸如的形式传递的地址,因为在单纯的位或位下的地址不会引起误会;
但是如果我们处于位代码中却不得不要对位地址进行操作时,那么我们只能通过基址偏移的形式,即先将的地址与它所在的段的基址做差,然后将基址传入描述符,以后如果要访问的真实地制只需要通过上面的差值(偏移)就行了。
我们还是先来看看代码多了什么内容:
1&SECTION&.gdt段语法结构很容易理解,只是多了几个描述符:
LABEL_GDT:&&Descriptor&&&&&&&&0,&&&&&&&&&&&&&&&&&0,&0&&&&&&&;&空描述符LABEL_DESC_NORMAL:&Descriptor&&&&&&&&0,&&&&&&&&&&&&0ffffh,&DA_DRW&&;&Normal&描述符LABEL_DESC_CODE32:&Descriptor&&&&&&&&0,&&SegCode32Len&-&1,&DA_C&+&DA_32&;&非一致代码段LABEL_DESC_CODE16:&Descriptor&&&&&&&&0,&&&&&&&&&&&&0ffffh,&DA_C&&;&非一致代码段LABEL_DESC_DATA:&Descriptor&&&&&&&&0,&DataLen&-&1,&DA_DRW&&;&DataLABEL_DESC_STACK:&Descriptor&&&&&&&&0,&&&&&&&&TopOfStack,&DA_DRWA&+&DA_32&;&Stack,&32&位LABEL_DESC_TEST:&Descriptor&0500000h,&&&&&&&&&&&&0ffffh,&DA_DRWLABEL_DESC_VIDEO:&Descriptor&&0B8000h,&&&&&&&&&&&&0ffffh,&DA_DRW&&;&显存首地址
&描述符的多少和种类是与执行的任务有关的,我们先放一放,回头再说。2.下面是一个数据段,装载次程序设计到的所有数据:
[SECTION&.data1]&&;&数据段ALIGN&32&&&&&&&&&&;ALIGN为定位之意,意思是下面为位代码[BITS&32]LABEL_DATA:SPValueInRealMode&dw&0;&字符串PMMessage:&&db&"In&Protect&Mode&now.&^-^",&0&;&进入保护模式后显示此字符串OffsetPMMessage&&equ&PMMessage&-&$$StrTest:&&db&"ABCDEFGHIJKLMNOPQRSTUVWXYZ",&0OffsetStrTest&&equ&StrTest&-&$$DataLen&&&equ&$&-&LABEL_DATA;&END&of&[SECTION&.data1]
SPValueInRealMode意为在实模式下的堆栈指针值,为进入保护模式后显示的字符串,为进入保护模式后的测试字符串。
&3.然后是一个堆栈段
全局堆栈段[SECTION&.gs]ALIGN&32[BITS&32]LABEL_STACK:&times&512&db&0
TopOfStack&equ&$&-&LABEL_STACK&-&1
4.之后正式进入代码:(实模式编程)
[SECTION&.s16][BITS&16]LABEL_BEGIN:&mov&ax,&cs&;cs为代码段起始地址&mov&ds,&ax&mov&es,&ax&mov&ss,&ax&mov&sp,&0100h
&mov&[LABEL_GO_BACK_TO_REAL+3],&ax&;
&位置为后面的:
即位跳回到位指令处,这句放到后面和另外几句统一讲。
mov&[SPValueInRealMode],&sp;保存实模式下堆栈指针到备以后还原时用
&初始化&位代码段描述符,是描述符就要初始化,没啥好说的&mov&ax,&cs&movzx&eax,&ax&shl&eax,&4&add&eax,&LABEL_SEG_CODE16&mov&word&[LABEL_DESC_CODE16&+&2],&ax&shr&eax,&16&mov&byte&[LABEL_DESC_CODE16&+&4],&al&mov&byte&[LABEL_DESC_CODE16&+&7],&ah
&&初始化&位代码段描述符&xor&eax,&eax&mov&ax,&cs&shl&eax,&4&add&eax,&LABEL_SEG_CODE32&mov&word&[LABEL_DESC_CODE32&+&2],&ax&shr&eax,&16&mov&byte&[LABEL_DESC_CODE32&+&4],&al&mov&byte&[LABEL_DESC_CODE32&+&7],&ah
&初始化数据段描述符&xor&eax,&eax&mov&ax,&ds&shl&eax,&4&add&eax,&LABEL_DATA&mov&word&[LABEL_DESC_DATA&+&2],&ax&shr&eax,&16&mov&byte&[LABEL_DESC_DATA&+&4],&al&mov&byte&[LABEL_DESC_DATA&+&7],&ah
&初始化堆栈段描述符&xor&eax,&eax&mov&ax,&ds&shl&eax,&4&add&eax,&LABEL_STACK&mov&word&[LABEL_DESC_STACK&+&2],&ax&shr&eax,&16&mov&byte&[LABEL_DESC_STACK&+&4],&al&mov&byte&[LABEL_DESC_STACK&+&7],&ah
&为加载&作准备&xor&eax,&eax&mov&ax,&ds&shl&eax,&4&add&eax,&LABEL_GDT&&;&eax&&-&gdt&基地址&mov&dword&[GdtPtr&+&2],&eax&;&[GdtPtr&+&2]&&-&gdt&基地址
&加载&&lgdt&[GdtPtr]
&关中断&cli
&打开地址线&in&al,&92h&or&al,&b&out&92h,&al
&准备切换到保护模式&mov&eax,&cr0&or&eax,&1&mov&cr0,&eax
&真正进入保护模式&jmp&dword&SelectorCode32:0&;&执行这一句会把&装入&,&并跳转到&处
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LABEL_REAL_ENTRY:&&;&从保护模式跳回到实模式就到了这里,放在后面讲&mov&ax,&cs&&&&&&&&&&&&&&&&;此时已经返回了实模式,必须先将各段寄存器赋值&mov&ds,&ax&mov&es,&ax&mov&ss,&ax
&mov&sp,&[SPValueInRealMode];还原堆栈指针
&in&al,&92h&&;&┓&and&al,&b&;&┣&关闭&地址线&out&92h,&al&&;&┛
&sti&&&;&开中断
&mov&ax,&4c00h&;&┓&int&21h&&;&┛回到&
;&END&of&[SECTION&.s16]
5.[SECTION&.s32]更没什么好说的了
6.最后讲讲
16&位代码段(s16code,其实是保护模式下的16位代码)由&位代码段跳入跳出后到实模式[SECTION&.s16code]ALIGN&32[BITS&16]LABEL_SEG_CODE16:&跳回实模式&mov&ax,&SelectorNormal&mov&ds,&ax&mov&es,&ax&mov&fs,&ax&mov&gs,&ax&mov&ss,&ax
&mov&eax,&cr0&and&al,&b&mov&cr0,&eax
LABEL_GO_BACK_TO_REAL:&jmp&0:LABEL_REAL_ENTRY&;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 段地址会在程序开始处被设置成正确的值.
& & & & & & & & & & & & & & & & & & & & & & & & & & & 在前面的实模式代码s16里有句:mov [label_go_back_to_real+3],ax
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 就是把实模式下的cs代替上面jmp中的0。从而实现在保护模式下把cs改造成和实模式一样。
Code16Len&equ&$&-&LABEL_SEG_CODE16
这段代码和在实模式下构造保护模式的段一样,要在保护模式下构造实模式的段以便跳回实模式.
在由保护模式向实模式跳转时候,由于每个段寄存器都配有段描述符高速缓冲寄存器,其内容会由保护模式状态下带到实模式下,
但其中内容的"格式(其实就是实模式下的段属性,在实模式下不能手工修改)"是保护模式下的格式,与实模式不匹配,所以要做两件事:
1.加载一个16位代码的选择子,即SelectorNormal,并将这个段的这个段描述符向ds,es,fs,gs,ss复制,其实并在用到这些寄存
器的值,只是为了把这些寄存器的高速缓冲寄存器中的内容刷新成16位的实模式下的"格式".
因为CS寄存器不能直接填充,所以只能从保护模式的32位代码跳转到16位代码由CPU自动去刷新CS寄存器的高速缓冲寄存器.
jmp&&& SelectorCode16:0的作用是jmp [cs:ip],所以SelectorCode16描述符被加载到CS段,完成对高速缓冲寄存器的刷新.
2.因为CS段属性已经正确,而开始时实模式下CS段的基址被保存在LABEL_GO_BACK_TO_REAL+3处,即jmp&&& 0:LABEL_REAL_ENTRY这条指令的段地址分部,
所以jmp&&& 0:LABEL_REAL_ENTRY 可以正确地跳到实模式的LABEL_REAL_ENTRY 处,并且将原来保存的实模式下的段地址带到LABEL_REAL_ENTRY 中.
这样完成了所有的寄存器的高速缓冲寄存器的内容的刷新成实模式的"格式"后,再跳入实模式的代码.所以从保护模式跳回实模式时
一定会借助一个Norma描述符和一个带有实模式的CS段地址的jmp指令.
本文来自CSDN博客,转载请标明出处:
(详情参考:)1.程序取得所需空间的两种方法:加载程序的时候系统分配和程序在执行的过程中向系统申请。
2.从规范的角度讲,我们不能随便决定哪段空间可以使用,应该让系统为我们分配;
3.DW的含义是定义字型数据,所占内存大小为16个字节;
4.假设dw在一个程序的开始定义了8个数据,那么这8个数据的地址在代码段的偏移分别是0,2,4,6,8,a,c,e处,对应的地址是cs:0,cs:2,cs:4,...cs:e等;
5.一般情况下我们将程序加入内存的时候系统会自动分配给我们一个段来存放这个程序,因此我们用debug查看的时候DS=XXXX,后面的数&#20540;给出我们这段程序开始的段地址;
6.在程序的第一条指令前面加上一个标号start,然后这个标号在end后面出现。这样可以让编译器知道我们程序的入口在什么地方,这里end多了另外一个作用,通知编译器程序入口在什么地方;
7.将程序,代码放入不同段:
(1)把他们放到一个段中使程序显得混乱;
(2)前面程序中处理的数据很少,用到的栈空间也少,加上没有多长的代码放到一个段里面没有问题。但是如果数据,栈和代码需要的空间超过了64k,就不能放在一个段中了;
8.受8086cpu的限制,一个段的容量不能大于64k,但是不是所有的cpu都是这个样子的;
9.对于不同的段,要有不同的段名,对于段地址的引用一般是段名加上该数据在段中的偏移地址;
(1) 下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,完成程序:assume cs:codesg
codesg segment
&&&&dw h,0789h,0abch,0defh,0fedh,0cbah,0987h
start: mov ax,0
&&&&mov ds,ax
&&&&mov bx,0
&&&&mov cx,8
s: mov ax,[bx]
&&&&mov cs:[bx],ax
&&&&add bx,2
&&&&loop s
&&&&mov ax,4c00h
&&&&int 21h
codesg ends
(2) 下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,数据的传送用栈来进行。栈空间设置在程序内。完成程序:
assume cs:codesg
codesg segment
&&&&dw h,0789h,0abch,0defh,0fedh,0cbah,0987h
&&&&dw 0,0,0,0,0,0,0,0,0,0&&&&&&&&&;10个字单元用栈空间
&&&&mov ax,cs&&&
&&&&mov ss,ax
&&&&mov sp,36
&&&&mov ax,0
&&&&mov ds,ax
&&&&mov bx,0
&&&&mov cx,8
&&&&push [bx]
&&&&pop cs:[bx]
&&&&add bx,2
&&&&loop s
&&&&mov ax,4c00h
&&&&int 21h
codesg ends
实验5 编写、调试具有多个段的程序
(1) 将下面的程序编译连接,用Debug加载、跟踪,然后回答问题assume cs:code,ds:data,ss:stack
data segment&&
dw h,0789h,0abch,0defh,0fedh,0cbah,0987hdata ends
stack segment&
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start: mov ax,stack&&&&&&
mov ss,ax&&&&&&
mov ax,data&&&&&&
push ds:[0]&&&&&&
push ds:[2]&&&&&&
pop ds:[2]&&&&&&
pop ds:[0]
mov ax,4c00h
① CPU执行程序,程序返回前,data段中的数据为多少?&&&解:不变
② CPU执行程序,程序返回前,cs=155ch、ss=155bh、ds=155ah。 (此题结果因环境而异,但相对差&#20540;不变)
③ 设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
(2) 将下面的程序编译连接,用Debug加载、跟踪,然后回答问题assume cs:code,ds:data,ss:stack
data segment&&&
stack segment&&&
stack ends
code segment
start: mov ax,stack&&&&&&
mov ss,ax&&&&&&
mov ax,data&&&&&&
push ds:[0]&&&&&&
push ds:[2]&&&&&&
pop ds:[2]&&&&&&
pop ds:[0]
mov ax,4c00h
① CPU执行程序,程序返回前,data段中的数据为多少?&&&解:不变
② CPU执行程序,程序返回前,cs=155ch、ss=155bh、ds=155ah。 (此题结果因环境而异,但相对差&#20540;不变)
③ 设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
④对于如下定义的段:
name segment…name ends
如果段中的数据占N个字节,则程序加载后,这段实际占有的空间为(N/16&#43;1)*16.&&&&&(N/16为取整数部分)
(3) 将下面的程序编译连接,用Debug加载、跟踪,然后回答问题assume cs:code,ds:data,ss:stack
code segment
start: mov ax,stack&&&&&&
mov ss,ax&&&&&&
mov ax,data&&&&&&
push ds:[0]&&&&&&
push ds:[2]&&&&&&
pop ds:[2]&&&&&&
pop ds:[0]
mov ax,4c00h
data segment&&&
stack segment&&&
stack ends
① CPU执行程序,程序返回前,data段中的数据为多少?&&&解:不变
② CPU执行程序,程序返回前,cs=155ah、ss=155eh、ds=155dh。 (此题结果因环境而异,但相对差&#20540;不变)
③ 设程序加载后,code段的段地址为X,则data段的段地址为X&#43;3,stack段的段地址为X&#43;4。
(4) 如果将(1)、(2)、(3)题中的最后一条伪指令“end start”改为“end”(也就是说不指明程序的入口),则那个程序仍然可以正确执行?请说明原因。
解:都能正常运行。如果不指明程序的入口,编译器自动默认代码段的第一条指令为程序的入口。
(5) 程序如下,编写code段中的内容,将a段和b段中的数据依次相加,将结果存到c段中。
assume cs:code
&&&&&&&&db 1,2,3,4,5,6,7,8
&&&&&&&&db 1,2,3,4,5,6,7,8
&&&&&&&&db 0,0,0,0,0,0,0,0
code segment
start:mov ax,a
s:mov al,ds:[bx]
add al,ds:[bx&#43;16]//不够16个字节的安16个字节来算
mov ds:[bx&#43;32],al
mov ax,4c00h
(5) 程序如下,编写code段中的内容,将a段和b段中的数据依次相加,将结果存到c段中。
assume cs:code
&&&&&&&&db 1,2,3,4,5,6,7,8
&&&&&&&&db 1,2,3,4,5,6,7,8
&&&&&&&&db 0,0,0,0,0,0,0,0
code segment
start:mov ax,amov ds,axmov bx,0
mov cx,8s:mov al,ds:[bx]add al,ds:[bx&#43;16]mov ds:[bx&#43;32],alinc bxloop s
mov ax,4c00hint 21h
(6) 程序如下,编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中。
assume cs:code
&&&&&&&&dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
&&&&&&&&dw 0,0,0,0,0,0,0,0
code segment
start:mov ax,a
s:push [bx]
mov ax,4c00h
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:59252次
排名:千里之外
原创:22篇
转载:92篇
评论:11条
(2)(4)(3)(6)(14)(4)(7)(19)(18)(13)(2)(7)(15)

我要回帖

更多关于 mov播放器 的文章

 

随机推荐