无法通过十六进制转换器读取 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 中的字符与字节有很大不同)。希望这对某人有所帮助。