鱼C论坛

 找回密码
 立即注册
查看: 5035|回复: 17

自学汇编语言,问一个菜鸟的问题

[复制链接]
发表于 2020-3-26 22:22:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
自学汇编语言,问一个菜鸟的问题,寻址的时候, d fff0:0 出来的地址只到fff0:0070, 要补上ff,才会显示到 fff0:00f0
ff是什么意思的缩写啊, cpu内部16位寄存器地址编辑后,是不是一一对应了外部寄存器的地址?run了内部寄存器地址的寻址过程,就执行了外部寄存器里的程序,是不是这个意思?先谢了!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-26 23:43:22 | 显示全部楼层
本帖最后由 jackz007 于 2020-3-26 23:45 编辑

      ff 是什么的缩写?
      十六进制的16个数: 1 2 3 4 5 6 7 8 9 a b c d e f
      是的,没错,f 是个十六进制数,对应的十进制数值是 15

      8086 CPU 的地址总线为 20 位,可寻址地址空间是 2 ^ 20 = 1048576 也就是 1 MB,但是,8086 CPU 的数据总线是 16 位的,也就是说,CPU 的字长是 16 位,所有的寄存器也都是 16 位的,通过寄存器可寻址的范围是 0 ~ 2 ^16 - 1 = 65535,也就是 64 KB,那么,问题就来了,CPU 的内存可寻址空间是 1 MB,而通过寄存器寻址只能达到 64 KB,1 MB 是 16 个 64 KB。怎么做才能对 1 MB 内存空间进行寻址呢,于是,就引入了 段:偏移的寻址方式,就是说,用两个 16 位数来联合表达一个 20 位的内存地址,段:偏移 表达方式到 20 位内存地址的计算关系是
  1.         20 位内存地址 = 段地址 x 10H + 偏移
复制代码

        在本例中,内存地址 fff0:0000 所对应的 20 位内存地址是 fff00,内存地址 fff0:0070 对应的 20 位内存地址是  fff70,于是,我们会发现,不同的 段:偏移 可以表达相同的内存地址。
  1.          fff0:0000  - fff00
  2.          ff00:0f00  - fff00
  3.          f000:ff00  - fff00
复制代码

        上面的三种形式表达的都是同一个内存地址 fff00,当然,这个地址的表达方式绝不仅仅这三种,还可以写出很多。
         内存地址 fff00 已经很接近内存顶端了,这段地址属于 ROM BIOS 区域,是不可更改的,从 fff00 ~ fffff 还剩 256 个字节空间,在 debug 中,为了看到这 256 个字节的内容,可以使用命令:
  1. d fff0:0 l100
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-27 02:52:43 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-27 06:08:16 | 显示全部楼层
看看我这么理解对不对,在cpu内部的寄存器里,段寄存器根据不同数据的性质,储存了所有的段地址信息,通用寄存器储存了偏移地址信息,寻址过程就是把偏移地址数据先导入段寄存器,组合成20位地址,然后寻址,到内存,执行内存里的信息。这样就构成了最基本的cpu执行程序的流程。谢谢大神!顺带咨询一个问题,在学习完汇编,我想学一门高级语言作为编程工具,最好是和区块链技术挂钩的 hyber leagher 类似的应用,请问哪儿个语言比较适合我,我知道现在python很流行是因为人工智能。希望大神能指路。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 16:57:00 | 显示全部楼层
本帖最后由 jackz007 于 2020-3-27 16:59 编辑
daywalker911 发表于 2020-3-27 06:08
看看我这么理解对不对,在cpu内部的寄存器里,段寄存器根据不同数据的性质,储存了所有的段地址信息,通用 ...


      段寄存器中记录了一部分地址信息,偏移地址也记录了一部分地址信息,将二者合二为一,才能构成一个完整的二十位内存地址。
      一个 DOS 程序所拥有的内存空间一般都分为三块,一块是数据区,用于存储全局变量、字符串等等,第二块是代码区,是用来储存程序指令的,第三块是堆栈区,可以用来临时保存变量,以及向函数传递调用参数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-27 21:26:26 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-28 08:53:26 | 显示全部楼层
又遇到了一个小问题,在做课后练习,debug语言的时候,发现cs 的ip会随着执行的code加3,或者2, 如果说我想覆盖掉原来寄存器里的指令代码,我用a命令,直接会从ip+3开始, 即使我用了r或者e指令企图修改,a命令后的IP依旧不变,我翻了视频和书都没有找到答案,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 11:19:09 | 显示全部楼层
daywalker911 发表于 2020-3-28 08:53
又遇到了一个小问题,在做课后练习,debug语言的时候,发现cs 的ip会随着执行的code加3,或者2, 如果说我 ...


        回复我的帖子请点击帖子下边框上的 "回复" 按钮,然后,在新弹出的文本框中编写文本内容,否则,你留信息给我系统不会进行提醒,我就不能及时看到。
        执行一条指令后,IP 会增加多少,取决于当前指令码的字节长度  
  1. 13B7:0100 B80100        MOV        AX,0001
复制代码

        这条指令的地址是 13B7:0100 ,指令码是 B8 01 00,长度是 3 个字节,那么,下一条指令的地址一定是 13B7:0103,跨度正好是当前指令的字节码长度。
        在 debug 中,要想修改哪个地址的指令,直接用 a <偏移地址> 就可以了,比如,如果要修改上面那条指令,就用下面的命令
  1. a 100
复制代码

        把新的汇编指令写进去就可以了。要注意的是,如果新指令与原来的指令长度不一致是要产生问题的。
        
           
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-28 12:43:47 | 显示全部楼层
jackz007 发表于 2020-3-28 11:19
回复我的帖子请点击帖子下边框上的 "回复" 按钮,然后,在新弹出的文本框中编写文本内容,否则 ...

wooow,谢谢!大神太厉害了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-1 00:53:58 | 显示全部楼层
jackz007 发表于 2020-3-28 11:19
回复我的帖子请点击帖子下边框上的 "回复" 按钮,然后,在新弹出的文本框中编写文本内容,否则 ...

汇编第四章,遇到了个问题,因为视频是基于masm5.0的现在的masm32了,看了介绍,和一些视频,貌似编译的code变的复杂多了,我写了code,现在卡在assemble 和link code上了。 大神或者站内哪里可以查到masm32的简单操作介绍。。。编程的慢慢长路啊!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-1 01:00:22 | 显示全部楼层
jackz007 发表于 2020-3-28 11:19
回复我的帖子请点击帖子下边框上的 "回复" 按钮,然后,在新弹出的文本框中编写文本内容,否则 ...

外加因为现在都是在DOSBox下的虚拟机上操作汇编,是不是要mount 编译文件的位置,把masm的文件拷贝到文件目录下,进行编译。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-1 06:27:34 | 显示全部楼层
做了一部分research:
1. mount 到程序所在的位置
2. path到 masm软件的所在位置
3 go to C:
4. 使用masm
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 10:37:50 | 显示全部楼层
本帖最后由 jackz007 于 2020-4-1 10:40 编辑
daywalker911 发表于 2020-4-1 01:00
外加因为现在都是在DOSBox下的虚拟机上操作汇编,是不是要mount 编译文件的位置,把masm的文件拷贝到文件 ...


      你现在应该老老实实地学习 MASM 5.0,MASM32 和你没有任何关系,那是一个博士应该关注的东西,你目前只是个幼儿园的小朋友,学习的路还有很长,搞清自己的能力和处境很重要!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-1 22:44:25 | 显示全部楼层
jackz007 发表于 2020-4-1 10:37
你现在应该老老实实地学习 MASM 5.0,MASM32 和你没有任何关系,那是一个博士应该关注的东西,你 ...

好吧。。。我先去找个能下载masm5.0的地方
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-17 22:04:41 | 显示全部楼层
jackz007 发表于 2020-4-1 10:37
你现在应该老老实实地学习 MASM 5.0,MASM32 和你没有任何关系,那是一个博士应该关注的东西,你 ...

学到现在才刚刚发现,在指向内存地址的时候,是有一个物理地址和逻辑地址之分的,在汇编的这本书里,说0200:0 到0200:ff,是一个物理地址还是逻辑地址?现在看书有晕的地方就是,物理地址和逻辑地址,书里解释的时候并没有标注,是不是大部分的地址,说的都是逻辑地止,你用debug r看的时候,段地址指向的,又是哪儿一个?谢谢!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-17 23:58:49 | 显示全部楼层
本帖最后由 jackz007 于 2020-5-17 23:59 编辑
daywalker911 发表于 2020-5-17 22:04
学到现在才刚刚发现,在指向内存地址的时候,是有一个物理地址和逻辑地址之分的,在汇编的这本书里,说02 ...


      0200:0 ~ 0200:ff  是一段内存范围,对应的 20 位地址表达形式为 02000 ~ 020ff。

      应该养成把 段+偏移 形式的内存地址转换为 20 位地址的习惯,这样,不管 段+偏移 在形式上怎么变,你都不会被迷惑到。

      对于 DOS 操作系统而言,内存的物理地址与逻辑地址完全是一回事,没有任何区别。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-18 16:28:46 | 显示全部楼层
首先,你的第一个问题,ff是什么意思?
答:“d fff0:0”  fff0:0表示一个内存地址:内存地址为:fff0h*10h+0=fff00h(后面带h是16进制的意思)

你的第二个问题,cpu内部16位寄存器地址编辑后,是不是一一对应了外部寄存器的地址?
答:CPU是通过“地址加法器”进行地址“编辑”的。  “编辑”方法:fff0h*10h+0=fff00h
        “编辑”后,对应内存“物理地址”,但不是一一对应,
如:fff0:0   ffef:10  ff00:f00等等很多个都对应“fff00h”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-5 21:43:15 | 显示全部楼层
停了大半年,看第二遍王爽的书才稍微入门一点,再问个小问题, push内存单位里的数据到栈里, 我已经set好DS了,然后用push 【2】这个命令,debug说error。是debug的命令格式变了,毕竟这本书那么久了,现在都是在dosbox上面run的debug。是不是在具体写code的时候,编译器还是认可的这个命令,如果是的话,我就试试写code, 编译, run, 然后去debug里面看看寄存器的情况,确定命令执行了!先谢了!
现在发现,能写算法的都是大神啊,把现有的函数关系式,转化成计算机的code,我觉得都要烧掉许多脑细胞,他们要把实际问题函数化,再电脑语言化。真尼玛牛啊!!
PS:互联网公司给程序员划年龄太过分了!年轻时候贡献了那么多脑细胞,因为精力问题,就让人走,我很是看不惯,虽然我不是吃电脑饭的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-23 22:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表