您的位置:控制工程论坛网论坛 » 教程与手册 » 几个简单的汇编初学者问题总结2

osmaosi

osmaosi   |   当前状态:在线

总积分:1122  2024年可用积分:0

注册时间: 2008-10-09

最后登录时间: 2022-04-26

空间 发短消息加为好友

几个简单的汇编初学者问题总结2

osmaosi  发表于 2008/10/14 9:27:35      607 查看 0 回复  [上一主题]  [下一主题]

手机阅读

几个简单的汇编初学者问题总结

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)   
1楼 0 0 回复