【问题标题】:How do I can use machine language without using the assembler and operating system? [duplicate]如何在不使用汇编程序和操作系统的情况下使用机器语言? [复制]
【发布时间】:2015-06-24 11:44:07
【问题描述】:

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

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

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

【问题讨论】:

  • 谢谢。但我说“最低级别的编程”。过去不是操作系统。所以程序员不使用字符编码。他们使用点击和点击(0和1)。
  • 随意编写一个引导扇区,它使用 BIOS 中断从键盘读取 0 和 1,将位存储在 RAM 中,然后跳转到该内存位置。您实际上如何做到这一点超出了 StackOverflow 答案的范围。
  • 过去,计算机通常有一个带有开关的前面板,用于手动输入二进制引导代码。由于显而易见的原因,现代用户不会忍受这一点,因此此类接口已被放弃,但是挖掘旧的PDP-11 小型计算机或类似设备应该不会太难。或者可能是Altair 8800 微型计算机或其竞争对手之一,尽管这会让你有点退缩。同样,对于能够以这种方式启动的系统而言,手动戳穿孔卡并不太难,只是非常乏味。
  • 能够“在键盘上输入”已经意味着运行着可以读取键盘的软件。因此,您的要求似乎有点矛盾。 :p “在最低级别编程”的机制取决于您的硬件设置。您的 PC 硬件并非旨在轻松完成此操作。也许您最接近的方法是使用您使用某种二进制编辑器创建的任何代码重新编程 PC 上的 BIOS 闪存。但这似乎不是您所追求的?不清楚...
  • 回顾一下:给自己买one of these things

标签: assembly machine-code


【解决方案1】:

严重的部分

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

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

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

游戏部分

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

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

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

  • 你只能使用01enter,其他的都被忽略了。
  • 您无法更正错误或覆盖以前编写的机器代码。
  • 只要输入 8 位,就会在内存中写入一个字节。
  • 字节按收集顺序一个接一个地写入。
  • 如果您需要更多数据,则不能写入超过 3.5KiB 的数据,您必须先编写一个新程序以写入内存,然后再使用它。
  • 如果您点击 enter,程序将执行您输入的机器代码。
  • 如果您在完成一个字节之前按 enter,则插入的位将被丢弃。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-15
    • 2021-10-28
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2023-01-28
    相关资源
    最近更新 更多