几个简单的汇编初学者问题总结
1 debug中使用sal指令的问题[问题]
在debug里面使用A指令,输入如下代码:
***************************
MOV AX,0ABC
DEC AX
AND AX,00FFH
MOV CL,4
SAL AL,1
***************************
当输入到 sal al,1 时提示error
[回答]
shl 与 sal 作用是完全一样的,所以在编译的时候自动将
sal 转换成了 shl .使用sal dubug 不识别,换成shl就搞定了。
可以把上述代码编译成 EXE 文件,然后用debug 中 u 指令查看,
结果 sal 的地方 被换成 shl。
2 看似 ''不可能'' 的汇编问题
[问题]
怎样用一条指令把BX的内容加上123,放在AX里?
[回答]
猛一看起来好像不可能,通常的做法是:
add bx,123
mov ax,bx
这至少要用到两条指令~~~要是mips机构的系统就好了,因为其中有
3参数指令:
addx $1,$2,100 ----- $1=$2+100
那么没办法了么?不是的!
想一下 lea 指令 ,呵呵~~~看一下如下的指令:
lea ax,[bx+123]
lea 取变量的偏移放入 ax 中,[] 代表变量是间接寻址,他的地址就等于[]
中的值,即 bx+123,这样就达到了题目的目的。
3 用移位指令来代替乘法指令
大家都知道可以用移位指令来做形如 2,4,8 等2的整次幂的乘法,
但是非整次幂呢?比如 乘10。其实很简单:
36 * 10 = 36 * (8 + 2) = 36 * 8 + 36 * 2
即等于:
24h * 8 + 24h * 2
接下来不用我讲了吧,这一方法也可以进一步推广。
4 察看 debug 状态寄存器
of(溢出) df(方向) if(中断) sf(符号) zf(零) af(辅助进位) pf(奇偶) cf(进位)
为一的时候
ov(OVerflow) dn(DowN) ei(Enable Interrupt) ng(NeGtive) zr(ZeRo) ac(Auxiliary Carry) pe(Parity Even) cy(CarrY)
为零的时候
nv(Not oVerflow) up(UP) di(DIsable interrupt) pl(PLus) nz(Not Zero) na(Not Auxiliary) po(Parity Odd) nc(Not Carry)
在debug里面使用A指令,输入如下代码:
***************************
MOV AX,0ABC
DEC AX
AND AX,00FFH
MOV CL,4
SAL AL,1
***************************
当输入到 sal al,1 时提示error
[回答]
shl 与 sal 作用是完全一样的,所以在编译的时候自动将
sal 转换成了 shl .使用sal dubug 不识别,换成shl就搞定了。
可以把上述代码编译成 EXE 文件,然后用debug 中 u 指令查看,
结果 sal 的地方 被换成 shl。
2 看似 ''不可能'' 的汇编问题
[问题]
怎样用一条指令把BX的内容加上123,放在AX里?
[回答]
猛一看起来好像不可能,通常的做法是:
add bx,123
mov ax,bx
这至少要用到两条指令~~~要是mips机构的系统就好了,因为其中有
3参数指令:
addx $1,$2,100 ----- $1=$2+100
那么没办法了么?不是的!
想一下 lea 指令 ,呵呵~~~看一下如下的指令:
lea ax,[bx+123]
lea 取变量的偏移放入 ax 中,[] 代表变量是间接寻址,他的地址就等于[]
中的值,即 bx+123,这样就达到了题目的目的。
3 用移位指令来代替乘法指令
大家都知道可以用移位指令来做形如 2,4,8 等2的整次幂的乘法,
但是非整次幂呢?比如 乘10。其实很简单:
36 * 10 = 36 * (8 + 2) = 36 * 8 + 36 * 2
即等于:
24h * 8 + 24h * 2
接下来不用我讲了吧,这一方法也可以进一步推广。
4 察看 debug 状态寄存器
of(溢出) df(方向) if(中断) sf(符号) zf(零) af(辅助进位) pf(奇偶) cf(进位)
为一的时候
ov(OVerflow) dn(DowN) ei(Enable Interrupt) ng(NeGtive) zr(ZeRo) ac(Auxiliary Carry) pe(Parity Even) cy(CarrY)
为零的时候
nv(Not oVerflow) up(UP) di(DIsable interrupt) pl(PLus) nz(Not Zero) na(Not Auxiliary) po(Parity Odd) nc(Not Carry)