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

版权声明:大熊猫猪·侯佩原创或翻译作品.谢绝转载! hopy https://blog.csdn.net/mydo/article/details/1776304

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

 

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)

原创】建议初学者必读

07-27

初学者问的诸如:《怎样配置环境变量》《怎样运行Servlet》啊?这样的问题太多了,现在我写一个初学者入门必读,以便对初学者有指导作用!rn首先是下载工具:rn我建议初学者用Editplus+JDK,我觉得如果用例如JB,Eclipse,JCreator,虽然刚开始的时候比较方便,但是确使初学者门不知道怎样配置环境变量,rn从而难以达到知其然,知其所以然的地步rn可以通过如下地址下载:rnEditplus(最新版本是v2.11):http://count.skycn.com/softdown.php?id=3641&url=http://sc-http.skycn.net/down/epp211a_cn.exe(要照注册码就自己找吧,网上很多的)rnJDK(最新版本是Java2sdk1_4_2):http://count.skycn.com/softdown.php?id=3116&url=http://sc-http.skycn.net/down/j2sdk-1_4_2-windows-i586.exe(这是For Windows)rnrn然后就是安装JDK,我是把它装到从c:\JDK目录下面:rn然后就是CLASSPATH的问题了:rn正如操作系统利用PATH来搜索可执行程序一样,Java运行环境也会遍历CLASSPATH来查找类,即便是HelloWorld这样简单的程序,JVM也会遍历rnCLASSPATH定义的每一个路径,直到找到相应的文件为止。rn相信大家用的系统不是2k就是XP,然后就应当如下设置Path:rn我的电脑->属性->高级->环境变量rn然后在环境变量的Path后面追加: C:\JDK\bin;.;C:\JDK\librn也可以这样配置:C:\JDK\bin;.;C:\JDK\lib\dt.jar;C:\JDK\lib\tools.jarrn★记住:环境变量中的 . 切记不能少,它表示当前路径,如果少掉出现的错误等会就说!rndt.jar是关于运行环境的类库,tools.jar是关于一些工具的类库rn如果没有配置:C:\JDK\bin,则会出现 “ javac' 不是内部或外部命令,也不是可运行的程序或批处理文件。”这样的错误。rn然后下面就该写程序了:rn首先是(HelloWorld.java),打开Editplus,新建一个Java文件,请照着如下输入,要一字不漏,并且分清大小写:rnpublic class HelloWorldrn public static void main(String[] args)rn System.out.println("Hello,World!");rn rn rn然后把这个文件保存(ctrl + s)到HelloWorld.java,记住大小写一定要分清,是HelloWorld.java不是helloworld.java或者其他的rn下面就该运行了,开始->运行->cmdrn在控制台中把目录切换到当前目录:rnjavac HelloWorld.javarnjava HelloWorldrn你就会在控制台上看见输出的Hello,World!(没出来?我把电脑吃了:))rnjavac是编译命令,它把HelloWorld.java编译成HelloWorld.classrnjava就是解释命令,JVM把HelloWorld.class解释执行.rn在这个时候:rn1。如果出现Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldrn那就是你在环境变量中没有加上那个.(dot)rn2。如果出现Exception in thread "main" java.lang.NoSuchMethodError: main rn或者HelloWorld.java:1: Public class helloworld must be defined in a file called rnrn"HelloWorld.java". rn那就是你没有分清大小写的写入这个HelloWorld,或者保存得时候没有保存为HelloWorld.javarn这个名字一定要跟public class的名字一样rnrn对于环境变量的问题就说到这里,下面我先所说怎么在Editplus里面编译和运行,在Tools->参数设置->配置用户工具rn1.添加工具(添加应用程序)rn菜单文字:Compile Java Programrn程序:C:\JDK\bin\javac.exern参数:文件名称rn初始目录:文件目录rn2.添加工具(添加应用程序)rn菜单文字:Run Java Programrn程序:C:\JDK\bin\java.exern参数:文件名称(不含扩展名)rn初始目录:文件目录rnrn工具组名称可以随便添,比如Debug Java Programrn然后在Tools的下拉菜单中,你就会看见Compile Java Program以及Run Java Program这两个选项,以后你就可以利用ctrl + 1编译和ctrl +2运行程序了rnrnrn下面就讨论Servlet的运行:rn首先要运行Servlet,则需要JSP/Servlet container,我建议初学者用TomcatrnTomcat(最新版本5.0):http://cvs.apache.org/builds/jakarta-tomcat-5/nightly/jakarta-tomcat-5-bin-20030725.ziprn然后把这个压缩包解压到:rnC:\Tomcatrn然后再配置环境变量:rn添加三个系统变量:rnJAVA_HOME: C:\JDKrnTOMCAT_HOME: C:\TomcatrnCLASSPATH: %JAVA_HOME%\lib;%TOMCAT_HOME%\librnTomcat的环境变量就配置完毕了,下面检验Tomcat是否能够运行:rn在控制台中转到C:\Tomcat\bin这个目录,运行startup,然后回出现一个窗口,连跳一大串东西,最后表示Server已经运行rn在浏览器中输入http://localhost:8080,出现欢迎界面,则表示Tomcat没问题了rn然后和上面一样,写入你的第一个Servletrnimport java.io.*;rn import javax.servlet.*;rn import javax.servlet.http.*;rn public class HelloWorld extends HttpServletrn rn public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOExceptionrn rnrn response.setContentType("text/html"); rn PrintWriter out = response.getWriter();rn out.println(" ");rn out.println("This is my first Servlet");rn out.println("");rn out.println(" Hello,World!");rn out.println("");rn rn rn rn 然后照样用javac HelloWorld.java来编译这个文件,如果出现无法import javax.servlet.*rn 那么就是应该把C:\Tomcat\common\lib里面的servlet.jar文件拷贝到C:\JDK\jre\lib\ext中,再次编译,就没有问题了!rn 然后在Tomcat目录里面的C:\Tomcat\webapps\ROOT里面按如下的文件结构:rn ROOT\index.htmlrn ROOT\welcom.jsprn ROOT\WEB-INF\lib\MyServlet.jar(如果你的servlet的.class打成了.jar文件,则放在lib下面)rn ROOT\WEB-INF\classes\HelloWorld.class(把上面生成的HelloWorld.class文件放在这个里面)rnrn 然后在浏览器中输入http://localhost:8080/servlet/HelloWorld,于是Server众望所归的报错了:Error 404--Not Found rn 怎么回事呢?rn Servlet必须使用C:\Tomcat\webapps\ROOT\WEB-INF这个目录下面的web.xml文件进行注册,用EP打开这个web.xml文件,rn 在里面加入rn rn HelloWorldrn HelloWorldrn rn rn HelloWorldrn /servlet/helloworldrn rnrn 这样的结构rn rn HelloWorldrn HelloWorldrnrn表示指定包含的servlet类.rn而以下的结构rn rn HelloWorldrn /servlet/HelloWorldrn rn 表示指定HelloServlet应当映射到哪一种URL模式。rn 在修改web.xml完毕过后,重新启动Server,然后再输入http://localhost:8080/servlet/HelloWorld,那么偌大一个Hello,World!等着你呢,恭喜你rn 摆平了:)rn 艾,手都打累了,就写到这儿吧,希望对初学者有一点作用!rnrnrnrnrnrn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试