в 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.