hopy | 侯佩

大熊猫侯佩 ! 不要和偶比懒,偶懒得和你比 -_-b

hope yangID:mydo
40757次访问,排名2664好友57人,关注者106
asm & C
mydo的文章
原创 34 篇
翻译 0 篇
转载 20 篇
评论 90 篇
hopy|侯佩的公告

intel 还是 at&t ?这是个问题!

贪吃贪睡的大熊猫侯佩!


最近评论
chtitaxie:不错,相当好.
goho100:特别想学黑客技术,但是却什么都不懂,有劳费心了!
mldstk:wow power leveling
huyongzs:哇,厉害。
chenjava:高手,,可以把完整代码放出来吗?FarAddr是指向哪个地址的啊?
文章分类
收藏
    相册
    程人画册
    生随画册
    常逛网站
    aogo汇编站
    sourceforge
    Windows Sysinternals
    www.0ginr.com
    www.reactos.org
    www.rootkit.com
    个人电脑
    中国IT实验室
    中国电子顶级开发网
    安全焦点
    安全矩阵
    安徽机票网
    看雪论坛
    第8个男人
    邪恶八进制论坛
    驱动开发网
    高端调试
    朋友的blog(排名不分先后)
    Chen 的 blog
    信仰 的 blog
    兔子 的 blog
    十月印象 的 blog
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 [原创]汇编初学者问题合集收藏

    新一篇: 对C++ STL iostram 中 cin.get(char* cs,int size,char c='\n') 的理解 | 旧一篇: [原创]汇编实现大数乘除运算的雏形

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

     

    0 关于指令时间的问题

     

    上次有兄弟问关于 指令时间的问题,答复查看 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)

    发表于 @ 2007年09月07日 15:51:00|评论(loading...)|

    新一篇: 对C++ STL iostram 中 cin.get(char* cs,int size,char c='\n') 的理解 | 旧一篇: [原创]汇编实现大数乘除运算的雏形

    评论

    #wh_peng 发表于2007-09-18 16:14:36  IP: 121.15.105.*
    asdf
    #wh_peng 发表于2007-09-18 16:15:16  IP: 121.15.105.*
    #qIwEiXuE 发表于2007-09-18 19:51:20  IP: 202.173.10.*
    嘿嘿,,我也来顶....

    最近熟悉了fat/ntfs 文件系统布局...

    还有才开始研究SCSI命令....
    #westso 发表于2007-09-19 21:10:40  IP: 222.82.75.*
    大哥!帮我看看这个问题啊~~~先谢谢了!http://topic.csdn.net/u/20070919/03/5692720a-dba4-47a5-9446-95ae6c1e3fd5.html
    #ljzip 发表于2007-09-20 11:10:41  IP: 222.187.125.*
    讲了这么多,汇编到底怎么用呀,用他做一件事情需要程序多大呀
    #surgent 发表于2007-10-21 21:59:08  IP: 61.132.138.*
    受益了,好好学习
    #s19812500 发表于2007-11-04 21:13:53  IP: 61.187.64.*
    汇编是不是很难呀,总感觉!!
    还希望有高手这点一二!!
    #hceng 发表于2007-11-11 19:39:39  IP: 60.176.125.*
    我也顶
    #survast 发表于2007-11-20 20:23:27  IP: 218.27.84.*
    先留言 以后慢慢来看
    #zspdecember 发表于2007-12-29 09:17:58  IP: 202.109.126.*
    开始学习汇编,先看个初学的贴,占个位
    #satanmp 发表于2008-01-18 16:02:54  IP: 218.26.173.*
    大哥
    讲的好呀!
    给我了好大的启示!
    #tccqs 发表于2008-01-23 23:00:50  IP: 218.0.4.*
    我来逛逛,,呵呵
    #wl8610510 发表于2008-01-25 02:07:43  IP: 117.76.216.*
    我也是刚学汇编,看了hopy的文章让我受益匪浅,不过更吸引我的是hopy的那个时钟的flash,我还看了那个网站,蛮好玩滴,^_^,开心
    #ngn999 发表于2008-02-21 21:23:47  IP: 58.19.9.*
    我先是用Masm6.11的可是很难设置啊,
    好像不能用!
    所以我又下载了个masm2008.2 的ide
    这个要好点.能用!
    装了这个应该也能用命令行吧!
    #mydo 发表于2008-02-23 21:05:45  IP: 60.166.249.*
    应该可以
    #newhand 发表于2008-03-12 11:04:01  IP: 220.173.136.*
    lea ax,[bx+123]

    这个是不是先把bx地址加上123(不是BX内容加123吧?),再把这个地址给ax啊???????
    #newhand 发表于2008-03-12 11:05:20  IP: 220.173.136.*
    往博主能指点一下啊。。

    我的博客:http://www.asmedu.net/blog/user/usermain.jsp?neighborId=8432
    #western8 发表于2008-03-24 22:38:15  IP: 221.12.171.*
    汇编是比较底层,是个细致活……
    #dichun 发表于2008-04-25 22:58:23  IP: 116.25.35.*
    学习!
    #tengxuelin 发表于2008-06-02 11:37:56  IP: 125.93.79.*
    还是看不明确
    #boluor1987 发表于2008-06-14 23:11:41  IP: 59.172.140.*
    很好的,谢谢了
    #goho100 发表于2008-07-08 12:46:09  IP: 61.191.16.*
    特别想学黑客技术,但是却什么都不懂,有劳费心了!
    #chtitaxie 发表于2008-07-14 20:32:09  IP: 61.189.159.*
    不错,相当好.
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © hopy|侯佩