无法通过十六进制转换器读取 NASM 的 Bin 文件输出
Trouble Reading Bin File Output of NASM through a Hex Converter
在 Ubuntu 17.10.1 x86_64
我对不同的assemblers assemble汇编代码(即NASM)的方式很感兴趣,看看我是否可以构建一个mini-assembler作为一个迷你项目。
所以我写了一些非常简单的汇编命令:
test.asm
mov ax, 48
mov bx, 48
add ax, bx
我assemble将没有优化的文件放入bin文件(nasm没有-f默认为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 个寄存器则总是转换为 FFFDDFFD 而不管使用哪个寄存器
-从那以后,无论在实际写入的 asm 文件中使用了哪些寄存器,add 始终为 01FFFD(我尝试使用多个不同的参数添加并以相同的“01 FF FD”结束)
其他不一致之处:
-jmp 和调用机器码不使用输入的数字
-div 和 mul 在机器码(FFFFFFFD)中是相同的,不管 .asm 文件中输入的参数如何
注意:我没有使用 objdump -d [file] 因为它不识别 bin 文件,我使用的是 bin 文件,而不是 elf64。
一段时间后(回过头来看这段 java 代码,我确实发现它过于复杂了),我发现问题很小;我需要一个 FileInputStream 而不是 FileReader。 FileInputStreams 能够读取二进制文件,而 FileReader 更适合人类可读的文件。为了证明我的观点,FileInputStreams 能够将数据读取到字节数组中,而 FileReaders 只能读取字符数组和 CharBuffers 形式的数据(Java 中的字符与字节有很大不同)。希望这对某人有所帮助。
在 Ubuntu 17.10.1 x86_64
我对不同的assemblers assemble汇编代码(即NASM)的方式很感兴趣,看看我是否可以构建一个mini-assembler作为一个迷你项目。
所以我写了一些非常简单的汇编命令:
test.asm
mov ax, 48
mov bx, 48
add ax, bx
我assemble将没有优化的文件放入bin文件(nasm没有-f默认为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 个寄存器则总是转换为 FFFDDFFD 而不管使用哪个寄存器
-从那以后,无论在实际写入的 asm 文件中使用了哪些寄存器,add 始终为 01FFFD(我尝试使用多个不同的参数添加并以相同的“01 FF FD”结束)
其他不一致之处:
-jmp 和调用机器码不使用输入的数字
-div 和 mul 在机器码(FFFFFFFD)中是相同的,不管 .asm 文件中输入的参数如何
注意:我没有使用 objdump -d [file] 因为它不识别 bin 文件,我使用的是 bin 文件,而不是 elf64。
一段时间后(回过头来看这段 java 代码,我确实发现它过于复杂了),我发现问题很小;我需要一个 FileInputStream 而不是 FileReader。 FileInputStreams 能够读取二进制文件,而 FileReader 更适合人类可读的文件。为了证明我的观点,FileInputStreams 能够将数据读取到字节数组中,而 FileReaders 只能读取字符数组和 CharBuffers 形式的数据(Java 中的字符与字节有很大不同)。希望这对某人有所帮助。