在Ubuntu 17.10.1上x86_64
我对不同汇编程序汇编汇编代码(即NASM)的方式感兴趣,看看我是否可以将迷你汇编程序构建为迷你项目。
所以我写了一些非常简单的汇编命令:
TEST.ASM
mov ax, 48
mov bx, 48
add ax, bx
我将没有优化的文件组装到bin文件中(没有-f的nasm默认为bin):
nasm -O0 test.asm
我编写了一些java代码,将生成的文件输出转换为十六进制数字:
import java.io.*;
import java.util.*;
public class hex{
public static void main(String[] args) throws Exception{
FileReader fr = new FileReader("test");
int i = 0;
while(true){
i = fr.read();
if(i == -1) break;
String s = toHex(i);
for(int j = 0; j < s.length(); j++){
System.out.print(s.charAt(j));
}
}
}
public static String toHex(int dec){
String output = "";
int largest = 1;
int dec2 = dec;
while(dec2 >= 16){
dec2 /= 16;
largest++;
}
for(int i = largest-1; i>=0; i--){
output += hex(dec, i);
}
return output;
}
public static String hex(int dec, int index){
String output = "";
if(dec < 16) output = "0";
for(int i = 0; i < index; i++){
dec /= 16;
}
dec %= 16;
if(dec > 10) output += (char)(dec+55);
else output += dec;
return output;
}
}
但是当我运行十六进制时,它输出FF FD 30 00 FF FD 30 00 01 FF FD!
这个问题?
无论第一个参数如何,-mov似乎总是转换为FFFD [value] 00,如果使用了2个寄存器,无论使用哪个寄存器,总是转换为FFFDFFFD
- 从那里开始,无论在实际的asm文件写入中使用了什么寄存器,add总是01FFFD(我尝试使用多个不同的参数添加并最终使用相同的&#34; 01 FF FD&#34;)
其他不一致之处:
-jmp并在机器代码中调用不使用输入的数字
无论.asm文件中输入的参数如何,-div和mul在机器代码(FFFDFFFD)中都是相同的
注意:我没有使用objdump -d [file],因为它无法识别bin文件,我使用的是bin文件,而不是elf64。
答案 0 :(得分:0)
一段时间后(回顾这段Java代码,我确实发现它过于复杂了),我发现问题很小。我需要一个FileInputStream而不是FileReader。 FileInputStreams能够读取二进制文件,而FileReaders更适合于人类可读的文件。只是为了证明我的观点,FileInputStreams能够将数据读取到字节数组中,而FileReaders只能读取char数组和CharBuffers形式的数据(Java中的char与字节有很大不同)。希望这对某人有帮助。