A. 如何编译VC工程中的asm文件
没有什么特别。例如:
#include<stdio.h>
#include<math.h>
int power2( int num, int power );
int main( )
{
int a=3,b=5;
printf( "3 * 2^5 = %d\n", power2( a, b) );
}
int power2( int num, int power )
{ __asm
{
mov eax, num ; Get first argument
mov ecx, power ; Get second argument
shl eax, cl ; EAX = EAX * ( 2 ^ CL )
}
// Return with result in EAX
}
====
就用普通的: CL 程序名 就编译和链接了。
编译成 .obj 不链接 用选项 -c
B. keil 4 中怎么编译asm文件
keil中编译ASM文件跟C文件是一样的,先建一个工程,将ASM文件添加进工程,现在就可以编译了,只要没有错误,OK,编译连接后就可以生成HEX文件供下载了。
C. ASM是怎样访问及修改编译了的class文件
ASM是基于ClassVisitor接口方法的调用顺序,提供了3个核心组件,用于产生和修改转换class
ClassReader解析compiled class的byte数组,其accept方法接受classVisitor的实例参数,按顺序调用它的各个visitXxx方法。将它作为事件的生产者。
ClassWriter直接构建二进制形式的class,toByteArray返回compiled class的byte数组。将它作为事件的消费者
ClassAdapter内部包装了一个ClassVisitor实例,代理所有的ClassVisitor接口方法。将它作为事件过滤器。
package org.objectweb.asm;
public abstract interface ClassVisitor
{
public abstract void visit(int paramInt1, int paramInt2, String paramString1, String paramString2, String paramString3, String[] paramArrayOfString);
public abstract void visitSource(String paramString1, String paramString2);
public abstract void visitOuterClass(String paramString1, String paramString2, String paramString3);
public abstract AnnotationVisitor visitAnnotation(String paramString, boolean paramBoolean);
public abstract void visitAttribute(Attribute paramAttribute);
public abstract void visitInnerClass(String paramString1, String paramString2, String paramString3, int paramInt);
public abstract FieldVisitor visitField(int paramInt, String paramString1, String paramString2, String paramString3, Object paramObject);
public abstract MethodVisitor visitMethod(int paramInt, String paramString1, String paramString2, String paramString3, String[] paramArrayOfString);
public abstract void visitEnd();
}
访问ClassVisitor接口方法的顺序:
visit visitSource? visitOuterClass? ( visitAnnotation | visitAttribute )*
( visitInnerClass | visitField | visitMethod )*
visitEnd
首先必须调用visit, 然后最多访问一次visitSource, 然后最多调用一次visitOuterClass, 然后选出visitAnnotation或者visitAttribute之一,对它访问若干次,
然后选出visitInnerClass或者visitField或者visitMethod 之一, 对它调用若干次
最后必须调用一下visitEnd
以下例子说明了ClassReader如何使用accept方法, 依次按照所谓的顺序,调用 ClassPrinter作为ClassVisitor的实现类的visitXxx方法,访问java.util.Map的。
查看accept方法内部,可以发现这个所谓的调用顺序。
/**
* @{#} ClassPrinter.java Created on Jun 10, 2010 9:37:57 PM
*
* this code example from asm-guide.pdf
* author.
*
*/
package example.me;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.Attribute;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.MethodVisitor;
public class ClassPrinter implements ClassVisitor {
public void visit(int version, int access, String name, String signature,
String superName, String[] interfaces) {
System.out.println(name + " extends " + superName + " {");
}
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
return null;
}
public void visitAttribute(Attribute attr) {}
public void visitEnd() {
System.out.println("}");
}
public FieldVisitor visitField(int access, String name, String desc,
String signature, Object value) {
System.out.println(" " + desc + " " + name);
return null;
}
public void visitInnerClass(String name, String outerName,
String innerName, int access) {}
public MethodVisitor visitMethod(int access, String name, String desc,
String signature, String[] exceptions) {
System.out.println(" " + name + desc);
return null;
}
public void visitOuterClass(String owner, String name, String desc) {}
public void visitSource(String source, String debug) {}
public static void main(String[] args) throws Exception {
ClassPrinter cp = new ClassPrinter();
ClassReader cr = new ClassReader("java.util.Map");
/*
* InputStream input = Thread.currentThread().getContextClassLoader()
* .getResourceAsStream( "java.lang.Runnable".replace('.', '/') +
* ".class"); ClassReader cr = new ClassReader(input);
*/
cr.accept(cp, 0); //cp是ClassVisitor的实现类,在accept方法的内部,以既定的顺序调用cp.visitXxx(...)方法,最终输出java.util.Map的编译后class结构
}
}
输出结果:java/util/Map extends java/lang/Object {
size()I
isEmpty()Z
containsKey(Ljava/lang/Object;)Z
containsValue(Ljava/lang/Object;)Z
get(Ljava/lang/Object;)Ljava/lang/Object;
put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
remove(Ljava/lang/Object;)Ljava/lang/Object;
putAll(Ljava/util/Map;)V
clear()V
keySet()Ljava/util/Set;
values()Ljava/util/Collection;
entrySet()Ljava/util/Set;
equals(Ljava/lang/Object;)Z
hashCode()I
}
D. .asm是什么文件
ASM是汇编语言源程序的扩展名,汇编语言(Assembly Language)是面向机器的程序设计语言。汇编语言是一种功能很强的程序设计语言,是利用计算机所有硬件特性并能直接控制硬件的语言。打开asm文件有两种方法即笔记本和MasmEdit软件。
在汇编语言中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。因此汇编语言亦称为符号语言。
使用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。汇编程序把汇编语言翻译成机器语言的过程称为汇编。
汇编语言比机器语言易于读写、调试和修改,同时具有机器语言全部优点。但在编写复杂程序时,相对高级语言代码量较大,而且汇编语言依赖于具体的处理器体系结构,不能通用,因此不能直接在不同处理器体系结构之间移植。
(4)asm编译类扩展阅读:
汇编语言的特点
1、面向机器的低级语言,通常是为特定的计算机或系列计算机专门设计的。
2、保持了机器语言的优点,具有直接和简捷的特点。
3、可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等。
4、目标代码简短,占用内存少,执行速度快,是高效的程序设计语言。
5、经常与高级语言配合使用,应用十分广泛。
E. 用NASM能将asm结尾的文件编译成exe么该怎么处理
可以吧,选择相应平台的版本,nasm -h 有简单的帮助的。
对 x86 也可以使用 Masm5/6 或 Masm32 来做,分别是 dos16 类或 Win32 类的程序。
不同汇编软件,对 asm 源程序的格式要求和支持也可能是不一样的。
F. C语言中的asm怎么用
_asm mov ax,0;
_asm{
mov ax,0
mov bx,0
}
两种写法都行,VC++6.0编译通过
G. 如何编译ASM文件
1. 在DOS命令中转到要编译文件所在的目录.
2.输入MASM.EXE空格+文件名.三下回车,就生成了OBJ文件,
3.link.exe空格+所生成的OBJ文件,再按三下回车,就生成了exe文件.
H. 如何将.asm 文件编译成.bin文件
bin是二进制文件,asm是汇编源程序,你可以用反汇编软件完成这个过程。当然效果一般不是很好,需要你耐心整理后才能有可读性。
I. asm编译的问题
是这样的:
ASM汇编连接后是.EXE程序,在.EXE程序的前部都有一个“重定位表”,里面保存了你的程序中所有类似你说的mov ax,code这样的指令中code部分(注意不是变量,是立即数)的偏移地址。而指令中code部分的值则汇编成“段的相对段值”,从第1个段算起。
举例来说,假设堆栈段在前面(长度=1000h字节),数据段居中(长度=2000h字节),代码段最后,那么,堆栈段的“相对段值”=0,数据段的“相对段值”=100h(1000h/16),代码段的“相对段值”=300h((1000h+2000h)/16)。也就是ASM程序将mov ax,code这条指令汇编成mov ax,300h(注意是立即寻址方式)
然后,OS执行该程序时,假设分配的内存地址是12340h(段地址=1234h),然后OS将程序调入1234h段中,然后读入重定位表,根据重定位表中的地址,就可以找到每一个类似mov ax,code指令中code(刚才说了,是立即数)的存放地址(在实际的code段中,OS肯定知道该段地址),然后将1234h“加入”该单元,于是该立即数就变成了1534h(1234h+300h),这正是从12340h开始,给堆栈段留1000h字节,然后再给数据段留2000h字节后的“代码段”的段地址(12340h+1000h+2000h=15340h,段地址=1534h)
现在,mov ax,code指令变成了mov ax,1534h,正确地指向了“代码段”。