mov ax,bx+5怎么被编译成mov ax,[bx+5]啊,无语

来源:百度知道 编辑:UC知道 时间:2024/09/21 03:30:21
比如bx=1,我要的是mov ax,6啊,他怎么给我编译成mov ax,[6]啊,真无语
写成mov ax,(bx+5)也没有用。
如果都要通过其它寄存器中转的话,我写一个mov ax,(160*(bx+1)+30)岂不是要麻烦得要死。
哪位大虾能教我一个这个虽然说很基本的问题。
刚试了下,mov ax,5+1会被正确地编译成mov ax,6
类似的mov ax,160*6+30也是可以的。

大哥 mov ax,bx+5 怎么可能你这么用呢?
这样就可以了啊
add bx,5
mov ax,bx

mov ax,(160*(bx+1)+30)你这个是什么意思啊? 编译器怎么知道BX的值是多少?
乘法的话也有用默认的寄存器。

大哥你还不明白?5+1编译器可以算出来是6,BX+1能算出来?BX是变量的嘛。

汇编不是高级语言,每一条语句对应的都是一条指令或者伪指令。高级语言里面可以你那样写,但是翻译过来对应汇编里面就是N条语句了。

这是MOV这个指令的问题
MOV这个指令只能进行几个类型的数据传送,所有的类型操作数(就是用","隔开的那两个东西)都必须是是一个单独的立即数,寄存器或内存,所以,BX+5是绝对错误的
把这些类型给你罗列一下吧,我说的不是很明白

mov 寄存器,立即数
mov 寄存器,寄存器
mov 寄存器,内存
mov 内存,立即数
mov 内存,寄存器

BX+5是一个寄存器加上一个立即数,所以不行 [BX+5]指的是BX+5这个内存地址
自己搜搜寻址方式吧
mov ax,5+1正常编译是因为5+1其实是一个立即数

不过你说的那种东西还是有的,再一些其他的指令集中有的ADD指令是可以实现你描述的那种的,是三操作数的

还有编译器不是人,所有它总会干出一些令人费解的东西,但如果你按规矩办事的话,它干起活来还是比较出色的

这里要关系到编译原理的问题。
bx+5编译器规定检查后自动加上[]
mov ax,bx+5
实际上执行的两条指令
add bx,5
mov ax,bx
但是编译器没有这么聪明,他不知道,他只知道一行对应一条指令
编译器只能优化有具体数值的指令 比如
mov ax,(offset array)*9+100
实际上 编辑只会自动算出后面的值 结果变成机器指令就是mov ax,一个算出来的数值