ax中写入的是字型数据还是地址?
譬如说王爽老师书的第三章 3.10 原题如下:这第一行的 mov ax,1000H,这个1000H是段地址吧, 第三行 mov ax,2266H,这个传入ax的是数据,那我怎么知道地址和数据是不是一个意思?为什么这个和1000H就是段地址,2266H就是字型数据. 来一个大神解释一下,这个问题有点纠结. 理解了吗? 虽然我也白,但是我知道mov ds,ax这句是重中之重 tianyuan 发表于 2017-3-19 20:36
理解了吗?
好吧,楼下说的有道理,谢谢!但是我还是想听你的答案! 首先,ds = 1000:0,0是偏移地址
2266H为数据地址
比如2266H内的数据是数字:123
它的物理地址为2266H
当我们找到2266H,也就找到了数据123 CPU并不象你的大脑一样,它并不知道你传入的是什么,它认识的只有0和1,
至于这些0和1组合起来要做什么,有什么目的,CPU并不知道,
它只知道符合它指令规则的,它就执行下去。不符合它指令规则的,它就执行不了,
或者执行之后变成与编写程序者要求目的不一样的结果。
本题中:
您的问题:“这第一行的 mov ax,1000H,这个1000H是段地址吧, 第三行 mov ax,2266H,这个传入ax的是数据,那我怎么知道地址和数据是不是一个意思?为什么这个和1000H就是段地址,2266H就是字型数据.”
1、这个传入ax的是数据,那我怎么知道地址和数据是不是一个意思?
它是地址还是数据有区别吗?地址同样也是一种数据,
我知道你问这个问题的意思,你的意思是如果是地址的话,就能做与地址有关的事情,如果是数据的话,它就能到某个位置进行运算诸如此类等等。
但是我想说的是不要纠结这些问题,ax通用寄存器“收到”了这个2266H就可以了。
2、为什么这个和1000H就是段地址,2266H就是字型数据.
你是说mov ,ax这句吗?这个玩意出现在这里,它没有在前面显式加上es:、ss:这样的段前缀,它就会自动“寻找”ds寄存器。
ds:就是代表的一个地址,为什么会这样,这是因为汇编的语法规则是这样的。
本帖最后由 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 , ax 把ax的值放内存 ds = ax 2266H 本帖最后由 瞌睡猪 于 2017-3-23 23:55 编辑
今天无聊来逛论坛,结果发现自己在这胡说,所以赶紧改掉
我的理解:所有传去ax的都是数据,没有代码。通过mov ds,ax 将ax数据传入ds中,此时CPU就知道要的是ds:指向地址中的数据。
若通过mov cs,ax将ax数据传入cs中,CPU就知道要的是cs:ip指向地址中的代码
所以是代码或者是数据,与ax无关,是寻址时是通过ds,还是cs来来寻址决定的 通用寄存器只是一个中介、是数据还是地址看你给谁了、给ds就是地址、给偏移地址就是数据。
而在本质上他们都是十六进制的数。
举个栗子:你在外面别人叫你叫铁柱、回到家里你妈叫你狗蛋、
而你对别人的意义也不同、在外面别人当你是个人、在家里你是你妈的儿子。
这样可明白了? 云野 发表于 2017-3-24 13:15
通用寄存器只是一个中介、是数据还是地址看你给谁了、给ds就是地址、给偏移地址就是数据。
而在本质上他们 ...
{:10_334:} 瞌睡猪 发表于 2017-3-21 15:52
今天无聊来逛论坛,结果发现自己在这胡说,所以赶紧改掉
我的理解:所有传去ax的都是数据,没有代码。通过m ...
那我就问你,还是上面的我贴题目的第三行
movax,2266H
这句话到底是将地址为2266H中的数据给ax,还是讲十六进制数值2266H这个数给ax, 也就是讲2266H这个十六进制数值给ds. 兰陵月 发表于 2017-3-20 22:13
CPU并不象你的大脑一样,它并不知道你传入的是什么,它认识的只有0和1,
至于这些0和1组合起来要做什么 ...
那我就问你,还是上面的我贴题目的第三行
movax,2266H
这句话到底是将地址为2266H中的数据给ax,还是讲十六进制数值2266H这个数给ax, 也就是讲2266H这个十六进制数值给ds. 脱鞋大王 发表于 2017-3-20 20:41
首先,ds = 1000:0,0是偏移地址
2266H为数据地址
比如2266H内的数据是数字:123
你说的我大概理解了.那我还是有疑问, 后面2266H后面不加H是不是就代表十进制的数值,?
打野的蓝猫 发表于 2017-3-25 23:07
那我就问你,还是上面的我贴题目的第三行
movax,2266H
这句话到底是将地址为2266H中的数据给ax,还是 ...
把2266H这个数给ax
我总体的意思大概是这样的,比如说内存中的数据是EB和08,假设他们对应的汇编指令为mov ax,16H(申明一下,我是乱写的,不记得机器码,只是假设),再假设他的地址为2000:10000,那么情况如下
如果CS:IP为2000:1000,那么他就是执行此处的指令,即mov ax,16H
如果ds:为2000:1000,那么他就是取的这个位置数据,即EB和08
CPU是通过分辨提供段地址的是CS还是ds来决定要的是这里的机器码对应的指令还是数据 打野的蓝猫 发表于 2017-3-25 23:09
你说的我大概理解了.那我还是有疑问, 后面2266H后面不加H是不是就代表十进制的数值,?
对的,如果在DEBUG中输入2266是十六进制,如果在编译器中2266不加H就是十进制
0X是十六进制的前缀
H是十六进制的后缀 打野的蓝猫 发表于 2017-3-25 23:07
那我就问你,还是上面的我贴题目的第三行
movax,2266H
这句话到底是将地址为2266H中的数据给ax,还是 ...
将2266h赋值给ax
执行完mov ax, 2266h 后
ax 中的值是 2266h
打野的蓝猫 发表于 2017-3-25 23:07
那我就问你,还是上面的我贴题目的第三行
movax,2266H
这句话到底是将地址为2266H中的数据给ax,还是 ...
mov ax,2266h,这是将2266H这个数值给了AX
MOV AX,,这是将段地址为某某,偏移为2266H的地址中的内容传给了AX 在计算机眼中 所有的东东都是数据 没有本质的区别 你把它当成 数据也许 指令也行 地址也行 脱鞋大王 发表于 2017-3-20 20:41
首先,ds = 1000:0,0是偏移地址
2266H为数据地址
比如2266H内的数据是数字:123
2266H 是数据,把2266放入1000:0 的地址中
页:
[1]