为什么在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从内存移往寄存器必须按字,而从内存往寄存器移则可以按字节可以按字,这是为什么?
...全文
371 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位

21,459

社区成员

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

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