Неполадки при чтении выходного файла бина NASM через шестнадцатеричный конвертер - PullRequest
0 голосов
/ 01 мая 2018

в Ubuntu 17.10.1 x86_64

Мне было интересно, как разные ассемблеры собирают ассемблерный код (а именно NASM), чтобы посмотреть, смогу ли я создать мини-ассемблер как мини-проект.

Итак, я написал несколько очень простых команд сборки:

test.asm

mov ax, 48
mov bx, 48
add ax, bx

Я собрал файл без оптимизаций в файл 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 [значение] 00 для значений независимо от первого параметра и всегда конвертирует в FFFDFFFD, если используются 2 регистра независимо от того, какие регистры используются

, исходя из этого, add всегда равен 01FFFD, независимо от того, какие регистры использовались в записанном фактическом файле asm (я попытался добавить с несколькими различными параметрами и в итоге получил один и тот же "01 FF FD")

Другие несоответствия:

-jmp и вызов в машинном коде не используют введенный номер

-div и mul одинаковы в машинном коде (FFFDFFFD) независимо от параметров, введенных в файл .asm

ПРИМЕЧАНИЕ: я не использовал objdump -d [файл], потому что он не распознает файлы bin, и я делаю это с файлами bin, а не с elf64.

1 Ответ

0 голосов
/ 20 октября 2018

Через некоторое время (и, оглядываясь назад на этот java-код, я обнаружил, что он довольно сильно усложнен), я обнаружил, что проблема довольно мала; Мне нужен FileInputStream вместо FileReader. FileInputStreams способны читать двоичные файлы, в то время как FileReaders больше подходят для читаемых человеком файлов. И чтобы доказать мою точку зрения, FileInputStreams способны считывать данные в байтовые массивы, в то время как FileReaders может считывать данные только в виде массивов char и CharBuffers (а символы в Java сильно отличаются от байтов). Надеюсь, это кому-нибудь поможет.

...