鱼C论坛

 找回密码
 立即注册
查看: 4741|回复: 19

ax中写入的是字型数据还是地址?

[复制链接]
发表于 2017-3-19 18:03:06 | 显示全部楼层 |阅读模式

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

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

x
譬如说王爽老师书的第三章 3.10 原题如下:
JLX~9Z`]3ORLA`73SD7FIDX.png
这第一行的 mov ax,1000H  ,这个1000H是段地址吧, 第三行 mov ax,2266H,这个传入ax的是数据,那我怎么知道地址和数据是不是一个意思?为什么这个和1000H就是段地址,2266H就是字型数据.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-3-19 18:11:15 | 显示全部楼层
来一个大神解释一下,这个问题有点纠结.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-19 20:36:04 From FishC Mobile | 显示全部楼层
理解了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-20 10:07:09 From FishC Mobile | 显示全部楼层
虽然我也白,但是我知道mov ds,ax这句是重中之重
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-20 19:27:54 | 显示全部楼层

好吧,楼下说的有道理,谢谢!但是我还是想听你的答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-20 20:41:31 | 显示全部楼层
首先,ds = 1000:0,0是偏移地址
          2266H为数据地址
         比如2266H内的数据是数字:123
        它的物理地址为2266H
         当我们找到2266H,也就找到了数据123
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2017-3-20 22:13:25 | 显示全部楼层
CPU并不象你的大脑一样,它并不知道你传入的是什么,它认识的只有0和1,

至于这些0和1组合起来要做什么,有什么目的,CPU并不知道,

它只知道符合它指令规则的,它就执行下去。不符合它指令规则的,它就执行不了,

或者执行之后变成与编写程序者要求目的不一样的结果。


本题中:

您的问题:“这第一行的 mov ax,1000H  ,这个1000H是段地址吧, 第三行 mov ax,2266H,这个传入ax的是数据,那我怎么知道地址和数据是不是一个意思?为什么这个和1000H就是段地址,2266H就是字型数据.”


1、这个传入ax的是数据,那我怎么知道地址和数据是不是一个意思?

它是地址还是数据有区别吗?地址同样也是一种数据,

我知道你问这个问题的意思,你的意思是如果是地址的话,就能做与地址有关的事情,如果是数据的话,它就能到某个位置进行运算诸如此类等等。

但是我想说的是不要纠结这些问题,ax通用寄存器“收到”了这个2266H就可以了。


2、为什么这个和1000H就是段地址,2266H就是字型数据.

你是说mov [0],ax这句吗?[0]这个玩意出现在这里,它没有在前面显式加上es:、ss:这样的段前缀,它就会自动“寻找”ds寄存器。

ds:[0]就是代表的一个地址,为什么会这样,这是因为汇编的语法规则是这样的。



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

使用道具 举报

发表于 2017-3-21 13:15:21 | 显示全部楼层
本帖最后由 tianyuan 于 2017-3-21 13:16 编辑
打野的蓝猫 发表于 2017-3-20 19:27
好吧,楼下说的有道理,谢谢!但是我还是想听你的答案!


问:
       第三行 mov ax,2266H,这个传入ax的是数据,那我怎么知道地址和数据是不是一个意思?
答:
       我们都知道不能直接给段寄存器和内存赋值  所以间接的通过 ax通用寄存器  操作
       ax 要看你用在哪了

        mov ds, ax   把ax的值给 ds 。ds = ax = 1000H

       mox [0], ax    把ax的值放内存 ds[0] = ax 2266H
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-21 15:52:53 | 显示全部楼层
本帖最后由 瞌睡猪 于 2017-3-23 23:55 编辑

今天无聊来逛论坛,结果发现自己在这胡说,所以赶紧改掉
我的理解:所有传去ax的都是数据,没有代码。通过mov ds,ax   将ax数据传入ds中,此时CPU就知道要的是ds:[bx]指向地址中的数据。
若通过mov cs,ax  将ax数据传入cs中,CPU就知道要的是cs:ip指向地址中的代码
所以是代码或者是数据,与ax无关,是寻址时是通过ds,还是cs来来寻址决定的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-24 13:15:40 | 显示全部楼层
通用寄存器只是一个中介、是数据还是地址看你给谁了、给ds就是地址、给偏移地址就是数据。
而在本质上他们都是十六进制的数。
举个栗子:你在外面别人叫你叫铁柱、回到家里你妈叫你狗蛋、
               而你对别人的意义也不同、在外面别人当你是个人、在家里你是你妈的儿子。

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

使用道具 举报

 楼主| 发表于 2017-3-25 22:55:11 | 显示全部楼层
云野 发表于 2017-3-24 13:15
通用寄存器只是一个中介、是数据还是地址看你给谁了、给ds就是地址、给偏移地址就是数据。
而在本质上他们 ...

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

使用道具 举报

 楼主| 发表于 2017-3-25 23:07:02 | 显示全部楼层
瞌睡猪 发表于 2017-3-21 15:52
今天无聊来逛论坛,结果发现自己在这胡说,所以赶紧改掉
我的理解:所有传去ax的都是数据,没有代码。通过m ...

那我就问你,还是上面的我贴题目的第三行
  mov  ax,2266H
这句话到底是将地址为2266H中的数据给ax,还是讲十六进制数值2266H这个数给ax, 也就是讲2266H这个十六进制数值给ds.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-25 23:07:41 | 显示全部楼层
兰陵月 发表于 2017-3-20 22:13
CPU并不象你的大脑一样,它并不知道你传入的是什么,它认识的只有0和1,

至于这些0和1组合起来要做什么 ...

那我就问你,还是上面的我贴题目的第三行
  mov  ax,2266H
这句话到底是将地址为2266H中的数据给ax,还是讲十六进制数值2266H这个数给ax, 也就是讲2266H这个十六进制数值给ds.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-25 23:09:04 | 显示全部楼层
脱鞋大王 发表于 2017-3-20 20:41
首先,ds = 1000:0,0是偏移地址
          2266H为数据地址
         比如2266H内的数据是数字:123

你说的我大概理解了.那我还是有疑问, 后面2266H后面不加H是不是就代表十进制的数值,?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-26 00:31:02 From FishC Mobile | 显示全部楼层
打野的蓝猫 发表于 2017-3-25 23:07
那我就问你,还是上面的我贴题目的第三行
  mov  ax,2266H
这句话到底是将地址为2266H中的数据给ax,还是 ...

把2266H这个数给ax
我总体的意思大概是这样的,比如说内存中的数据是EB和08,假设他们对应的汇编指令为mov ax,16H(申明一下,我是乱写的,不记得机器码,只是假设),再假设他的地址为2000:10000,那么情况如下
如果CS:IP为2000:1000,那么他就是执行此处的指令,即mov ax,16H
如果ds:[bx]为2000:1000,那么他就是取的这个位置数据,即EB和08
CPU是通过分辨提供段地址的是CS还是ds来决定要的是这里的机器码对应的指令还是数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-26 00:32:33 | 显示全部楼层
打野的蓝猫 发表于 2017-3-25 23:09
你说的我大概理解了.那我还是有疑问, 后面2266H后面不加H是不是就代表十进制的数值,?

对的,如果在DEBUG中输入2266是十六进制,如果在编译器中2266不加H就是十进制
0X是十六进制的前缀
H是十六进制的后缀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-26 19:48:54 | 显示全部楼层
打野的蓝猫 发表于 2017-3-25 23:07
那我就问你,还是上面的我贴题目的第三行
  mov  ax,2266H
这句话到底是将地址为2266H中的数据给ax,还是 ...

将2266h赋值给ax
执行完mov ax, 2266h 后
ax 中的值是 2266h
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-27 11:28:22 | 显示全部楼层
打野的蓝猫 发表于 2017-3-25 23:07
那我就问你,还是上面的我贴题目的第三行
  mov  ax,2266H
这句话到底是将地址为2266H中的数据给ax,还是 ...

mov ax,2266h,这是将2266H这个数值给了AX

MOV AX,[2266H],这是将段地址为某某,偏移为2266H的地址中的内容传给了AX
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-17 10:54:30 | 显示全部楼层
在计算机眼中   所有的东东都是数据    没有本质的区别    你把它当成 数据也许   指令也行   地址也行   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-17 12:31:12 | 显示全部楼层
脱鞋大王 发表于 2017-3-20 20:41
首先,ds = 1000:0,0是偏移地址
          2266H为数据地址
         比如2266H内的数据是数字:123

2266H 是数据,把2266放入1000:0 的地址中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 12:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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