db的用法!

wenhong609 2012-04-27 05:04:18
书上的一段代码,一直不是很理解!下面的是截取自己疑惑的部分!
addr dw number
number dw 5
mov bx addr
疑问是:number的值是存储05H的字的字节首地址,那么addr的值是什么?也是存储05H的字的字节的首地址吗??即addr的值是和number的值是一样的吗?number dw 5中的5是一个操作数,dw操作的是一个数,而addr dw number中的number是偏移地址,即dw操作的是一个偏移地址,操作5(一个内容)返回的是其偏移地址,操作number(一个偏移地址)又该返回什么呢?从上面mov bx addr可以知道,addr好像应该是5的偏移地址,那为什么不直接使用addr dw 5这样的形式来定义呢???
...全文
158 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gsy999 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
书上的一段代码,一直不是很理解!下面的是截取自己疑惑的部分!
addr dw number
number dw 5
mov bx addr
疑问是:number的值是存储05H的字的字节首地址,那么addr的值是什么?也是存储05H的字的字节的首地址吗??即addr的值是和number的值是一样的吗?number dw 5中的5是一个操作数,dw操作的是一个数,而addr ……
[/Quote]
.data
pNumber dw number
number dw 5

  (1)假定程序中的数据段就这么多(意思是,不会再有其他同名的数据段与其组合了),那么pNumber的偏移地址是0000,number的偏移地址是0002,所以经汇编、连接后,pNumber中的值是0002。
  为什么pNumber不在定义时直接初始化为0002呢?很简单,这是方便程序的维护(修改)。假设过了段时间,你要维护程序,你在number前面又定义了几个其他变量,那么number的首地址值就会变化,或者与其他文件的同名数据段组合后,number的首地址发生了变化,那么pNumber中的2就是错误的数据,而用标识符代替具体的数据,很好地解决了这个问题,它把问题留给汇编器去解决。

  (2)程序分析:
.code
...
mov si,pNumber ;si=0002,即number的偏移地址
mov ax,word ptr[si] ;ax=5,即number中的值

  mov bx,offset pNumber  ;si=0000,即pNumber的偏移地址
  mov si,[bx]        ;si=0002,即pNumber中的值:0002,它也是number的首地址
  mov ax,word ptr[si]   ;ax=5,即number中的值
大熊猫侯佩 2012-04-27
  • 打赏
  • 举报
回复
地址 +1
大熊猫侯佩 2012-04-27
  • 打赏
  • 举报
回复
当然不一样!
wenhong609 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

看看汇编是怎么安排地址:
0000 0002 R addr1 dw number;定义以addr1的一个字单元
0002 0005 number dw 5
0000 8B 1E 0000 R mov bx, addr1
[/Quote]
初学啊,这个看不懂啊,白话解释下吧,mov bx addr和mov bx number的效果是一样的吗!!
BAYNPU 2012-04-27
  • 打赏
  • 举报
回复
看看汇编是怎么安排地址:
0000 0002 R addr1 dw number;定义以addr1的一个字单元
0002 0005 number dw 5
0000 8B 1E 0000 R mov bx, addr1
db服务器连接mysql+redis高可用高性能框架干货1、使用c++语言,vs2019开发垮平台[windows和linux]连接MySql和redis框架。2、使用MySql持久化玩家数据,redis做玩家数据缓存层,redis不做数据持久化。mysql搭配redis工作效率非常高效,就好比男女搭配干活不累,没有redis,mysql也能独立很好的完成用户读写请求。有了redis,用户访问数据的效率更高,时间更短,快速的完成请求。3、讲解如何保持mysql和redis数据强一致性策略,并在代码里实现。每次启动redis,使用管道技术,从mysql批量导入活跃用户数据到redis中,并设置过期时间.4、教程使用线程池技术,每个线程拥有自己独立的数据,线程绑定类。每一个实例就包含一个线程每个线程数据里包含:mysql连接器、redis连接器、内存回收池、安全的串行队列、条件变量、互斥量保证线程内的数据安全。5、工作原理:没有请求时,各个工作线程处于休眠状态。有读写请求时,从线程池获取一个线程,添加读写请求,把数据推送到线程工作队列中。然后工作线程获取队列的数据,进行串行工作任务安排,进行mysql数据库读写操作,以及redis读写数据操作,当完成工作任务时,执行下一个工作任务,同时把处理结果推送到逻辑线程,把数据给用户。6、用户读数据策略:用户获取数据首先是先从redis查找数据,redis命中,返回数据给玩家,redis命中失败,mysql中查找数据,然后写入数据到redis中,返回数据给用户。7、用户写数据策略:用户先从redis中删除数据,然后写数据到mysql中,最后再把数据写入到redis中,保持数据一致性。8、教程是一个干货教程,不是新手教程,mysql基础语法讲解的少,redis有讲解基础系列。教程讲解的是如何搭建一个支持高并发,高性能的读写数据库框架,使用mysql+redis搭配的高可用、高性能框架。该套框架在多个项目使用过,也在棋牌类项目里面使用过。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧