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,正確地指向了「代碼段」。