几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量  


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » 程序设计 » 汇编语言
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


回复
 
主题工具 搜索本主题 显示模式
旧 2007-12-10, 01:46 PM   #1
huangyhg
超级版主
 
huangyhg的头像
 
注册日期: 04-03
帖子: 18592
精华: 36
现金: 249466 标准币
资产: 1080358888 标准币
huangyhg 向着好的方向发展
默认 【转帖】几个简单的汇编初学者问题总结

关于指令时间的问题



上次有兄弟问关于 指令时间的问题,答复查看 intel 手册是一个办法。
但很多人没有那个东东吧!,所以可以用另一招,在编译时加入 /Sc


选项:

ML /Fl /Sc Kinds.asm

还有有位兄弟问过 为什么 mov ax,offset table 比 lea ax,table 速度

要快?但到底快到什么程度,恐怕也没法感性认识。下面让偶们来

看看实际效果:

首先在源文件 Kinds.asm 中敲入:

data segment
tabledw?
data ends


code segment
assume cs:code,ds:data
start:
push ds
sub ax,ax
push ax


mov ax,data
mov ds,ax


mov ax,offset table
lea ax,table


idiv table

retf
code ends
end start


保存后,控制台中敲入:

ML /Fl /Sc Kinds.asm

完成后,在同一目录下用记事本打开 Kinds.lst 文件:

0000 datasegment
0000 0000 tabledw?
0002 dataends


0000 codesegment
assume cs:code,ds:data
0000start:
0000 10 1Epushds
0001 3 2B C0 subax,ax
0003 11 50 pushax


0004 4 B8 ---- Rmovax,data
0007 2 8E D8 movds,ax


0009 4 B8 0000 Rmovax,offset table
000C 8 8D 06 0000 R leaax,table


0010 177+ F7 3E 0000 R idivtable

0014 26 CB retf
0015 codeends
endstart


可以清楚地看到 :

mov ds,ax 只需要 2个时钟周期
mov ax,offset table 需要 4个
lea ax,table 则需要 8 个
而 idiv table 更是夸张的用到了超过 177 个时钟周期。


是不是一目了然呢?呵呵!

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)




5 关于简单汇编环境的搭建

如果是老鸟,则随心所欲自由选择。我在这里只是给新手一些我的建议。

我一向反对新手一上来(毫无汇编编译经验)就使用汇编的集成开发环境比如

radasm之类,这样不但容易出错,而且不能真正了解编译器和连接器的底

层命令行用法。因为汇编本身编译就已经很简单了,不像C++之类有那么多

优化的东东,你再套一个花里胡哨的集成环境,对初学者岂不很累?

但我认为用一个带颜色标记的编辑器却是有必要的。

(比如简单的几句用记事本就很好,复杂的我推荐使用editplus2(别忘了要

下载汇编的语法文件。)

总的来说整个汇编环境是这样的:

16位dos程序: masm6.1x or nasm + editplus2

32位windows程序: masm32v9.0 or nasm + editplus2 + 一个资源编辑器

(masm611下载地址: www.aogosoft.com,masm32下载地址

www.masm32.com)
huangyhg离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
回复


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭



所有的时间均为北京时间。 现在的时间是 03:13 AM.


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多