天赐雨 发表于 2014-5-30 18:50:51

为什么是3二不是2?菜鸟求大神帮助!

本帖最后由 天赐雨 于 2014-5-30 19:01 编辑

assume cs:codesg

codesg segment

    start:mov ax, offset start
          s:mov ax,offset s      ;这里为什么说相当于move ax 3   而不是move ax 2呢?                                                                           为啥是第一条指令是3个字节的机器码?
      
codesg ends

end start



kikiatw 发表于 2014-5-30 18:50:52

本帖最后由 kikiatw 于 2014-5-30 20:24 编辑

因為MOV 機械碼佔用三個字節, 所以START那一行是 0,1,2 共三個
S那一行是 3. 4 5 三個, 所以offset s 是代表第3個.
mov 佔用三個機械碼 小甲魚已經多次提到了, 為什麼占用三個呢?這問題就不用糾結了, 編譯器就是這樣編的, 這種問題就像是為什麼1+1 = 2 一樣
編譯器規定就是規定, 除非你想研究機械碼, 機械碼沒啥好研究的, 先把匯編搞清楚吧!!

請給分, 感謝!!

天赐雨 发表于 2014-5-30 21:38:47

kikiatw 发表于 2014-5-30 18:50 static/image/common/back.gif
因為MOV 機械碼佔用三個字節, 所以START那一行是 0,1,2 共三個
S那一行是 3. 4 5 三個, 所以offset s 是代 ...

感谢!那哪些是三个字节,哪些是2个字节或者其他,有说明么?

天赐雨 发表于 2014-5-30 21:46:59

天赐雨 发表于 2014-5-30 21:38 static/image/common/back.gif
感谢!那哪些是三个字节,哪些是2个字节或者其他,有说明么?

我看到有些mov指令是2个字节,有的MOV指令是3个字节这个又是为啥呢?

kikiatw 发表于 2014-5-31 06:37:36

mov 一個立即值到寄存器就是3個
mov 寄存器到寄存器就是2個
編譯出來的機械碼真的不用去糾結, 不然你學起來會很痛苦的,
後面有些例題是要你算跳到幾個指令以後, 像這種問題你只要自己照個寫一次
然後用debug看看是要跳到哪就好了, 真的不用去管它幾個字節

董登辉 发表于 2014-6-1 09:13:19

offset代表偏移,偏移地址占2个字节,在加上MOV指令的操作码的字节数就是三个字节.
楼主先不要纠结机器码,这里面学问挺多的,都是一个工程师设计的,想楼上说的先把汇编学好.

天赐雨 发表于 2014-6-1 22:08:36

董登辉 发表于 2014-6-1 09:13 static/image/common/back.gif
offset代表偏移,偏移地址占2个字节,在加上MOV指令的操作码的字节数就是三个字节.
楼主先不要纠结机器码,这 ...

哦,好!能弄清就弄清,不纠结了!(*^__^*)
页: [1]
查看完整版本: 为什么是3二不是2?菜鸟求大神帮助!