导航:首页 > 源码编译 > asm编译类

asm编译类

发布时间:2023-03-03 09:56:32

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,正确地指向了“代码段”。

阅读全文

与asm编译类相关的资料

热点内容
压缩面膜纸荧光 浏览:837
app怎么分身三个 浏览:742
电影bt下载源码 浏览:417
iwatch屏幕加密芯片 浏览:566
公安主题网站源码 浏览:982
天津市服务器供应商云服务器 浏览:107
数控车床子程序编程 浏览:107
floydwarshall算法 浏览:715
丢失微信app怎么找 浏览:250
php能写前端吗 浏览:5
服务器如何更改raid模式 浏览:90
方舟服务器怎么导出来 浏览:608
手机显示服务器异常什么鬼 浏览:379
新闻服务器的网址是什么 浏览:669
程序员年底招人 浏览:319
广发app怎么查房贷 浏览:860
安卓手机怎么下薯仔 浏览:921
只有一个app显示网络异常怎么回事 浏览:988
解压玩具是水宝宝 浏览:817
压缩机保护怎么解决 浏览:944