为什么在nasm中mov指令往内存移数据只能按字的方式

maojunhua 2005-01-21 02:59:44
为了对比写了如下指令
%define drive bp+24h
mov [drive],dl
mov dl,[drive]
mov [drive],dx
mov [0x7c24],dl
mov dl,[0x7c24]
mov [0x7c24],dx
mov dx,[0x7c24]
反汇编生成的代码变成
00007c49: ( ): mov dl, byte ptr ss:[bp+0x24] ; 885624
00007c4c: ( ): mov dl, byte ptr ss:[bp+0x24] ; 8a5624
00007c4f: ( ): mov word ptr ss:[bp+0x24], dx ; 895624
00007c52: ( ): mov dl, byte ptr [ds:0x7c24] ; 8816247c
00007c56: ( ): mov dl, byte ptr [ds:0x7c24] ; 8a16247c
00007c5a: ( ): mov word ptr [ds:0x7c24], dx ; 8916247c
00007c5e: ( ): mov dx, word ptr [ds:0x7c24] ; 8b16247c
也就是说mov从内存移往寄存器必须按字,而从内存往寄存器移则可以按字节可以按字,这是为什么?
...全文
372 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
maojunhua 2005-01-23
  • 打赏
  • 举报
回复
我开始没有发现问题的关键所在,如果问题改成这样就好了:
为什么
mov [drive],dl
mov dl,[drive]
生成的反汇编代码都是
mov dl, byte ptr ss:[bp+0x24]
原因前面已经说明了
maojunhua 2005-01-23
  • 打赏
  • 举报
回复
我觉得这个关系不大,只是属于良好的代码习惯。
memory只是表示一段存储空间的起始位置,比如尽管声明memory为dw,但是你仍然可以mov [memory],al
或者mov [memory],ax,但是如果申明memory 为db,而mov [memory],ax就有覆盖掉后面数据的危险.是否注明mov byte,mov word,很多情况下不用,编译器会做,因为8086的mov指令只能在寄存器之间以及寄存器和内存之间移动数据,编译器可以作语法检查的时候很好的判断
maojunhua 2005-01-23
  • 打赏
  • 举报
回复
要结的,可是昨天结算不成功,不晓得怎么回事
VisionCat 2005-01-23
  • 打赏
  • 举报
回复
谢谢,你的夸奖。

不过,该是秋后算帐的时候了。反正你的分也要给人。

不如结给我吧。^_^。

你可是三年来第一个可能会给我分的人哦。
shinesi 2005-01-23
  • 打赏
  • 举报
回复
是的,boch有时候反汇编出来不正确,我也发现过。

不过没你看的仔细-_-
VisionCat 2005-01-22
  • 打赏
  • 举报
回复
我觉得,你这里还有一个问题。

也就是在你访问地址的时候那个地址你是如何申明的?

memony db 0 ;这个是字节
memony dw 00000h ;双字节。
maojunhua 2005-01-22
  • 打赏
  • 举报
回复
谢谢楼上,你可能没看到我前面的回帖,后来找到的原因是bochsdbg 2.1.1的bug,在检查机器码的时候才发现的,也怪平时太信任工具了,碰到问题总是先从自己身上找院应,浪费了不少时间,现在换回2.0.2就好了,已经向他们报告bug了。
VisionCat 2005-01-21
  • 打赏
  • 举报
回复
建议楼主先看看NASM的文档。就算English也应该看看再来问吧^_^

其实很简单。

MASM的编辑语法习惯很不好。个人觉得。

建议以后向内存写内容的时候(在NASM下)

应该用

mov byte[memony],bl
mov word[memony],bx
mov dword[memony],ebx

希望我的回答能让你满意。
maojunhua 2005-01-21
  • 打赏
  • 举报
回复
00007c52: ( ): mov dl, byte ptr [ds:0x7c24] ; 8816247c
00007c56: ( ): mov dl, byte ptr [ds:0x7c24] ; 8a16247c
弄明白了,两句的机器码不一样,反汇编结果一样,是bochs的bug,用td看就对了
maojunhua 2005-01-21
  • 打赏
  • 举报
回复
而dx则没问题
mov [0x7c24],dx
mov dx,[0x7c24]
-------------------------
00007c5a: ( ): mov word ptr [ds:0x7c24], dx ; 8916247c
00007c5e: ( ): mov dx, word ptr [ds:0x7c24] ; 8b16247c
maojunhua 2005-01-21
  • 打赏
  • 举报
回复
先别看dx,对比
mov [0x7c24],dl
mov dl,[0x7c24]
-----------------
00007c52: ( ): mov dl, byte ptr [ds:0x7c24] ; 8816247c
00007c56: ( ): mov dl, byte ptr [ds:0x7c24] ; 8a16247c
完全不同的指令,生成同样的代码
shinesi 2005-01-21
  • 打赏
  • 举报
回复
倒,看看dl 和 dx有什么不同!!!!!
dl是8位 , dx是16位
第1章 基本知识 1-1 汇编语言介绍 1-1-1 程序设计语言分类 1-1-2 汇编语言程序设计的意义 1-2 位及字节 1-3 二进制数 1-3-1 数字系统 1-3-2 补码 1-3-3 BCD码 1-4 十六进制表示法 1-5 ASCII码 1-6 个人计算机组成 1-6-1 处理器 1-6-2 内部存储器 1-6-3 段与地址 1-6-4 寄存器 1-7 硬件断 课后习题 第2章 程序加载并执行 2-1 操作系统的组成 2-2 BIOS启动程序 2-3 系统加载程序 2-4 堆栈 课后习题 第3章 NASM汇编语言基础 3-1 源程序行格式 3-2 伪指令 3-2-1 定义含有初值的数据 3-2-2 定义不含初值的数据 3-2-3 INCBIN伪指令 3-2-4 EQU伪指令 3-2-5 TIMES伪指令 3-3 有效地址 3-4 常量 3-4-1 数字常量 3-4-2 字符常量 3-4-3 字符串常量 3-4-4 浮点数常量 3-5 表达式 3-5-1 OR运算符 3-5-2 XOR运算符 3-5-3 AND运算符 3-5-4 位运算符 3-5-5 加及减运算符 3-5-6 乘及除运算符 3-5-7 单元运算符 3-6 临界表达式 3-7 局部标号 3-8 预处理器 3-8-1 %define指令 3-8-2 %undef指令 3-8-3 %assign指令 3-8-4 多行宏 3-8-5 条件汇编 3-8-6 预处理循环 3-8-7 文件引用指引 3-8-8 标准宏 3-8-9 汇编语言指引 3-9 目标文件格式 3-10 NASM汇编程序安装 3-11 范例 课后习题 第4章 一般指令 4-1 源操作数与目的操作数 4-2 MOV传送指令 4-3 XCHG互换指令 4-4 有效地址送寄存器指令LEA 4-5 指针送寄存器指令LDS及LES指令 4-6 压入PUSH及弹出POP指令 4-7 存储寄存器PUSHA及POPA指令 4-8 标志寄存器传送PUSHF及POPF指令 4-9 没有运算的NOP指令 课后习题 第5章 基本输入与输出 5-1 软件断INT指令 5-2 将一个字符串输出到屏幕 5-3 从键盘输入一个字符 5-4 将一个字符输出到屏幕 5-5 从键盘输入一个字符串 5-6 将一个字输出到屏幕 5-7 显示内存内容 5-8 键盘输入控制 5-8-1 由键盘输入字符 5-8-2 直接由键盘输入或输出字符 5-8-3 直接由键盘输入字符 5-8-4 直接由键盘输入字符 5-8-5 由键盘输入字符串 5-8-6 检查键盘缓冲区 5-8-7 清除键盘缓冲区 5-8-8 从键盘缓冲区读取字符 5-8-9 测试键盘缓冲区是否有字符 5-8-10 传回控制键状态 5-9 屏幕输出控制 5-9-1 显示字符 5-9-2 显示字符串 5-9-3 设定光标位置 5-9-4 向上滚动屏幕 5-10 打印机输出控制 5-10-1 输出字符至打印机 5-10-2 打印一个字符 5-10-3 取得打印机状态 课后习题 第6章 程序流程控制 6-1 标志寄存器 6-2 改变标志的指令 6-3 条件转指令 6-4 比较两个整数 6-5 无条件转指令JMP 6-6 循环指令LOOP 6-7 选择结构 6-8 循环结构 课后习题 第7章 算术运算 7-1 定点数与浮点数 7-2 带符号及无符号整数 7-3 加法及减法 7-4 乘法 7-5 除法 7-6 BCD十进制数运算 7-6-1 BCD加法 7-6-2 BCD减法 7-6-3 BCD乘法 7-6-4 BCD除法 7-6-5 BCD宏应用 7-7 综合例题 课后习题 第8章 宏 8-1 单行宏 8-1-1 %define指令 8-1-2 %undef指令 8-1-3 %assign指令 8-2 多行宏 8-2-1 显示字符串宏 8-2-2 显示字符宏 8-2-3 读取字符宏 8-2-4 显示字节宏 8-2-5 读取字符串宏 8-2-6 字符串转换为数值 8-2-7 数值转换为字符串 8-2-8 数值输出至屏幕 8-3 条件汇编 8-4 预处理循环 8-5 源程序文件的包含内容 8-6 相关宏汇总 课后习题 第9章 过程 9-1 过程的定义 9-2 过程里的局部变量 9-3 传值调用 9-4 传址调用 9-5 堆栈传递参数 9-6 内存传递参数 课后习题 第10章 字符串处理 10-1 声明字符串 10-2 字符串长度 10-3 基本字符串指令 10-4 转换指令XLATB 10-5 字符串宏 课后习题 第11章 位运算 11-1 位基本运算 11-2 位屏蔽 11-3 AND指令 11-4 OR指令 11-5 XOR指令 11-6 NOT指令 11-7 TEST指令 11-8 改变位位置 11-9 左及右 11-10 算术左及算术右 11-11 循环位 11-12 位及循环位指令总结 11-13 综合例题 课后习题 第12章 文件处理 12-1 输入及输出层次 12-2 输入及输出概念 12-3 标准的文件代号 12-4 建立一个文件代号 12-5 打开一个文件 12-6 关闭一个文件 12-7 从文件或设备读取数据 12-8 数据写入文件或设备 12-9 动文件指针 12-10 检查并修改文件属性 12-11 建立新文件 12-12 删除文件 12-13 文件改名 12-14 建立或删除子目录 12-15 取得当前目录 12-16 改变当前目录 12-17 取得缺省的磁盘驱动器 12-18 改变缺省的磁盘驱动器 12-19 低级输入及输出 课后习题 第13章 数据结构 13-1 数组声明 13-2 数组查找 13-3 使用XLATB指令转换 13-4 排序 13-5 队列 13-6 堆栈 13-7 链表 课后习题 第14章 浮点数运算 14-1 80x87协处理器的运算 14-2 浮点堆栈 14-3 状态字 14-4 控制字 14-5 数据类型 14-5-1 二进制整数 14-5-2 聚集十进制数 14-5-3 实数 14-5-4 七种数据类型值的范围 14-6 80x87指令集 14-7 范例 课后习题 第15章 连接程序 15-1 建立NASM源程序 15-2 将目标文件连接成.exe文件 15-3 显示DOS的BIOS区域数据 15-4 系统设备数据 15-5 内存容量 课后习题 附录 NASM汇编语言指令

21,459

社区成员

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

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