如何在不使用汇编器和操作系统的情况下使用机器语言?

时间:2015-06-24 11:44:08

标签: assembly machine-code

如何在不使用汇编程序和操作系统的情况下使用机器语言?

如何直接输入0和1?我知道这很愚蠢,但我只想知道它是如何工作的,我可以用机器语言编写程序而不使用汇编程序和操作系统并在操作系统中安装任何其他工具吗?

我可以通过键盘分别输入0和1吗?没有使用操作系统?事实上,编程,从头开始!

1 个答案:

答案 0 :(得分:0)

严重的部分

正如评论中指出的那样,你不能再通过弄乱交换机将程序加载到现代计算机内存中,它必须是某种形式的媒体,从广义上说,固件可以加载和执行它。

可以使用编程器在ROM(或类似)中编程固件,这与将0和1写入计算机存储器尽可能接近。请注意,通常机器代码是用十六进制而不是二进制编写的。

在现代操作系统中,您可以使用任何十六进制编辑器编写机器代码,问题是程序二进制文件不包含可执行代码。它们还包含标题和许多“meta”(让我们用这种方式称呼)数据。因此,您必须构建一个包含所有标题,部分等的有效结构 这不是不可能的,一切都归结为一些基本的数学和一个很好的参考,只是它非常乏味。

游戏部分

作为一款游戏,如果你想感受用二进制代码编写程序的旧烦恼,你可以按照迈克尔的建议使用一个启动程序,让你把数字写入内存。

我为IA32写了一个(可能是您的架构),您必须使用NASM来组装它并将512字节输出文件写入任何可启动媒体(Google会帮助您)。然后重新启动计算机。

这里有一些限制(功能?)

  • 您只能使用 0 1 输入,其他所有内容都会被忽略。
  • 您无法纠正错误或覆盖以前编写的机器代码。
  • 只要输入8位,就会在内存中写入一个字节。
  • 字节按照收集的顺序依次书写。
  • 如果你需要更多的数据,你不能写更多3,5KiB的数据,你必须先写一个新程序写入内存然后再使用它。
  • 如果按输入,程序将执行您输入的机器代码。
  • 如果在完成一个字节之前按输入,则会丢弃插入的位。

Here我为在屏幕上写 Hi 的程序插入机器代码。

这是代码

BITS 16
jmp 07c0h:WORD __START__

__START__:
  mov ax, cs
  mov ss, ax
  xor sp, sp
  push cs
  pop ds
  push 0b800h
  pop es



  mov di, 200h  ;Write binary code from 7c0h:200h to 7c0h:ffffh, i.e. 3,5KiB 


.screen_input:  
  mov ax, 03h
  int 10h
  xor si, si

.byte_input:
  mov cx, 0800h

.bit_input:
  xor ah, ah
  int 16h

  cmp al, 0dh
  je .jump

  cmp al, '0'
  jb .bit_input

  cmp al, '1'
  ja .bit_input

  mov ah, 0ch
  mov WORD [es:si], ax
  add si, 02h

  shr al, 1
  rcl cl, 1

  dec ch
  jnz .bit_input

  mov BYTE [di], cl
  inc di

  add si, 90h
  cmp si, 0fa0h
  jae .screen_input

jmp .byte_input

.jump:
  jmp 7c0h:200h

  TIMES 505-($-__START__) db 0
  dw 0aa55h