1table有4个表目,每个指向一个子程序的偏移地址
2ah是8位寄存器(字节),用来传送子程序编号,对头
3add bx,bx是为了由子程序编号得到存放对应子程序的偏移地址的表目的偏移地址(有点拗口),可替换为shl bx,1
4add bx,bx怎么会得双字,顶多就17位,就是说可能溢出
5table[bx]是内存单元,对,寄存器相对寻址。他的宽度,要看环境。如另外一个 *** 作数或者word ptr table[bx]
多加分,少匿名,会有很多人答!
<首先声明,绝不是复制粘贴的,句句出自本人经验中提炼而出>
汇编是计算机编程中最为基础部分。
你先学了C/C++,正处于空中楼阁的尴尬处境。因为你在开发C/C++的时候,总觉得有一层雾纱隔着。无法真正看到问题的本质。人类对于无法控制的事总有一种反抗及寻根问底的情绪。
而你把汇编学通了,才能真正地从汇编连通到 *** 作系统,连通到C/C++。你才能真正看清计算机。这才能有机会步入大师级计算机学问境界。
用一句话:站在巨人的肩膀上……
比如只学现在流行的面向对象语言C#、Java等,虽然在短期内你可能会成为这方面的能手,但是想突破是有限的。因为本身的起步就低了。
再言,现在网络发展极快,C#、Jave这种浮于水面的技术很快会被新的东西所取代。但是C#、Java和更加新的未知技术都是从底层的汇编等变化而来。只要学好基础,一句话:以不变应万变。
我不知道学了汇编达到什么水平。但是学了汇编绝对能达到难以想象的水平。
就这一点,王爽老在他的书中提到了。《汇编语言》(第二版)P104页,上面写着参考48节内容。原因大致如下:
设找到一段起始地址为
SA:0000
的容量足够的空闲内存区;在这段内存区的前256个字节中,创建一个称谓程序段前缀(PSP)的数据区,DOS要利用PSP来和被加载程序进行通信(不理解的话可以暂且记住);在这段内存区的256字节处开始(在PSP的后面),将程序装入,程序的地址被设为SA+10H:0(这里确实是256个字节,256
=
1616,所以会空出
100H
的空间,也就是10:0H,“写法可能不对,暂且这么理解”);将这段内存区的段地址存入ds中,初始化其他相关的寄存器后,设置CSIP指向程序的入口。
——摘自并改编自
王爽《汇编语言》(第二版)
清华大学出版社
第一,为什么在用debug时,ds中的内容和psp的首地址相同,
-----------
DEBUG软件,留给被调试的程序的空间,就是这样的。
这是微软公司设计的结果,不用问为什么。
====
第二,既然psp是256个字节,为什么是sa+10h,而不是sa+100h,盼望详解!
-----------
sa+10h,是作为段地址,当用它合成为物理地址的时候,会在后面添是个0。
那么,被调试的程序代码的存储位置就是:(sa+10h)0H + 0000H=sa+100H。
其实很简单:下载一个masm615的压缩文件(直接在百度主页里搜“masm615下载”),大概432M,下载后,解压缩到D:盘,将文件夹的名字改为masm,这是因为解压后的名字默认为masm 615,中间有个空格不太好(因为再DOS下对于有空格的文件夹的名字要用双引号括起来,比较麻烦)。
1、用记事本或其他文本编辑器(例如Editplus)写好汇编程序,保存为asm格式的文件(直接将后缀名修改为asm),例如文件名为testasm,放到D:盘。
2、在windows下点击“开始”,再点击“运行”,在编辑框中输入cmd,切换到DOS界面下。进入D:盘——d:,再回车。
3、在当前目录(D:盘下)用cd命令,切换到刚才解压到D:盘的masm目录下的BIN目录下——
cd masm\bin
4、 然后生产目标文件,使用命令——masm D:\testasm(后缀名可以省略,默认为asm),生成obj的目标文件,该目标文件在D:\masm\BIN目录下。将生成的obj文件拷贝到D:盘根目录下(其实不用拷贝也行,只要下面能找到该obj文件就行,个人建议将obj文件和asm文件放到一起比较清楚)。
5、再使用命令将obj目标文件链接成exe文件(还在D:\masm\BIN目录下使用命令)——
link D:\testobj(后缀名可以省略,默认为obj),出现选项让你选,第一个选项是让你输入生成的exe文件的名字,例如输入——D:\testexe(后缀名可以省略,默认为exe),其他选项暂时可以不考虑(其实看他们的名字就能看懂)。这样就在D:盘下生成了一个testexe的可执行文件。
6、双击该文件,发现屏幕闪了一下就没了,说明程序是运行了。要想看到程序每一步的执行情况,那么生成的testexe文件要在Debug模式下运行。在DOS界面下(任何目录)输入命令——debug D:\testexe(此时后缀名exe必须要有),回车后就开始运行该可执行文件了。按照王爽那本书上从第91页开始的程序执行过程的跟踪使用的一些命令,例如:r命令、u命令、d命令、g命令、p命令等的使用,就能查看和控制程序的运行了。
本人也是第一次学习,如有错误,还请各位大佬指正!
(1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为 13位 。
(2)1KB的存储器有 1024 个存储单元,存储单元的编号从 0 到 1023 。
(3)1KB的存储器可以存储 8192 个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=1024B8=2^N,N=13。
(2)存储器的容量是以字节为最小单位来计算的,1KB=1024B。
(3)8Bit=1Byte,1024Byte=1KB(1KB=1024B=1024B8Bit)。
(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)在存储器中指令和数据没有任何区别,都是二进制信息。
2020720
(1) 写出每条汇编指令执行后相关寄存器中的值。
mov ax,62627 AX=F4A3H
mov ah,31H AX=31A3H
mov al,23H AX=3123H
add ax,ax AX=6246H
mov bx,826CH BX=826CH
mov cx,ax CX=6246H
mov ax,bx AX=826CH
add ax,bx AX=04D8H
mov al,bh AX=0482H
mov ah,bl AX=6C82H
add ah,ah AX=D882H
add al,6 AX=D888H
add al,al AX=D810H
mov ax,cx AX=6246H
(2) 计算2的四次方
mov ax,2 AX=2
add ax,ax AX=4
add ax,ax AX=8
add ax,ax AX=16
2020720
(1) 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为 0010H 到 1000FH 。
解题过程:
物理地址=SA16+EA
EA的变化范围为0h~ffffh
物理地址范围为(SA16+0h)~(SA16+ffffh)
现在SA=0001h,那么寻址范围为
(0001h16+0h)~(0001h16+ffffh)
=0010h~1000fh
(2) 有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到此单元。则SA应满足的条件是:最小为 1001H ,最大为 2000H 。
当段地址给定为 1001H 以下和 2000H 以上,CPU无论怎么变化偏移地址都无法寻到20000H单元。
解题过程:
物理地址=SA16+EA
20000h=SA16+EA
SA=(20000h-EA)/16=2000h-EA/16
EA取最大值时,SA=2000h-ffffh/16=1001h,SA为最小值
EA取最小值时,SA=2000h-0h/16=2000h,SA为最大值
这里的ffffH/16=fffh是通过WIN自带计算器算的
按位移来算确实应该为ffffh,这里小数点后的f应该是省略了
单就除法来说,应有商和余数,但此题要求的是地址最大和最小,所以余数忽略了
如果根据位移的算法(段地址16=16进制左移一位),小数点后应该是不能省略的
我们可以反过来再思考下,如果SA为1000h的话,小数点后省略
SA=1000h,EA取最大ffffh,物理地址为1ffffh,将无法寻到20000H单元
这道题不应看成是单纯的计算题
2020720
下面的3条指令执行后,cpu几次修改IP?都是在什么时候?最后IP中的值是多少?
movax,bx
subax,ax
jmpax
答:一共修改四次
第一次:读取movax,bx之后
第二次:读取subax,ax之后
第三次:读取jmp
ax之后
第四次:执行jmp
ax修改IP
最后IP的值为0000H,因为最后ax中的值为0000H,所以IP中的值也为0000H
2020720
以上就是关于王爽 汇编语言全部的内容,包括:王爽 汇编语言、把王爽的《汇编语言》学完之后是什么水平、王爽老师的汇编语言书 中为什么ds = 0B2D,程序就从0B3D开始等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)