我听说计算机只能理解基数二(二进制)中的数字多年。 最近,我想深入了解我的机器是如何工作的,停止高级脚本语言并阅读少数组装。 我明白这种语言的目标是让CPU快速:简单,CPU可以轻松解码汇编指令。 对不起,如果我的问题不明确,我会尽量清除疑虑: CPU如何将程序集转换为二进制? 我的问题可能毫无意义,因为计算机也玩电,在这种情况下,我的问题是: 它是什么意思:“计算机只能理解二进制”?
答案 0 :(得分:2)
汇编语言只是人类可以读取的东西(操作码)和机器可以读取的东西(二进制电子符号)之间的中间表示。
当您在汇编程序中编写程序时,汇编程序将其转换为二进制文件,此二进制表示形式存储在某些支持(硬盘驱动器,软盘,磁带......等)中。
当计算机执行你的二进制文件时,这里(基本上)会发生什么:
10110 = current, no current, current, current, no current
)触发一些操作进入CPU的内部电路(它可能触发例如添加,或者CPU负载或CPU电路支持的任何其他操作。了解这一点的最佳方法是尝试构建一个非常简单的4位处理器(假设有4个操作和16个字节的RAM)。互联网上有很多教程。
这意味着什么:“计算机只能理解二进制”?
它只是意味着CPU只在其逻辑门中理解“指令”,形式为:{current,no current},这些符号的每个特定系列触发特定操作进入CPU的某个部分并提供一些结果。
答案 1 :(得分:2)
"计算机只能理解二进制文件"是对现实的过度简化。 CPU(目前仅限于CPU)是一个非常复杂的硬件。它由诸如算术和逻辑单元(ALU)和控制单元(CU)之类的模块组成。
现在是一个CPU可以理解的程序"只是二进制,现在要了解这意味着人们需要从根本上理解内存的工作原理。使用晶体管构建存储器,晶体管用于创建逻辑门(这里隐藏更复杂)。记忆的工作方式就像它在一个恒定的循环中一样。如果你通过它提供电流(将其值设置为1),那么只要有功率,它就会继续将它反馈回自身。当发生这种情况时,我们说那段内存的值为1(因为那里有当前的)。如果没有电流,则存储器位置的值为0(无电流)。
现在"跑步"程序意味着将存储器块(包含程序)的存储器内容馈送到CPU中。这是程序的入口点,并且来自功率脉冲/无功率(0和1)的脉冲块基于存储器内容开始流入CPU。根据CPU在输入中获得的内容以及内部的CPU架构,电流将遵循不同的路径,并且在CPU的输出上,结果将根据输入的不同而变化。每个CPU如何做到这一点非常漫长而复杂(https://en.wikipedia.org/wiki/Processor_design表示CPU在内部的表现如何)。
现在,如果你在汇编中写东西,它会通过一个专门的程序来翻译你在等价的二进制表示中写的内容。
例如,如果您编写类似ADD 2, 3
的内容,那么汇编器会将其转换为0和1的流,当它通过CPU时将产生5(或5的二进制表示)
答案 2 :(得分:0)
将汇编语言代码转换为二进制文件的过程称为编码。 假设您对微控制器进行编程,并且拥有一个STM32F0xxxxμC,它嵌入了Cortex-M0处理器。该处理器的体系结构是ARMv6-M。您可以参考名为《体系结构参考手册》 https://static.docs.arm.com/ddi0419/d/DDI0419D_armv6m_arm.pdf的文档以获取指令编码。
示例:import SwiftUI
enum DirectionX {
case horizontal
case vertical
}
struct SwiftyUIScrollView<Content: View>: UIViewControllerRepresentable {
var content: () -> Content
var axis: DirectionX
var numberOfPages = 0
var pagingEnabled: Bool = false
var pageControlEnabled: Bool = false
var hideScrollIndicators: Bool = false
init(axis: DirectionX, numberOfPages: Int,
pagingEnabled: Bool,
pageControlEnabled: Bool,
hideScrollIndicators: Bool,
@ViewBuilder content: @escaping () -> Content) {
self.content = content
self.numberOfPages = numberOfPages
self.pagingEnabled = pagingEnabled
self.pageControlEnabled = pageControlEnabled
self.hideScrollIndicators = hideScrollIndicators
self.axis = axis
}
func makeUIViewController(context: Context) -> UIScrollViewController<Content> {
let vc = UIScrollViewController(rootView: self.content())
vc.axis = axis
vc.numberOfPages = numberOfPages
vc.pagingEnabled = pagingEnabled
vc.pageControlEnabled = pageControlEnabled
vc.hideScrollIndicators = hideScrollIndicators
return vc
}
func updateUIViewController(_ viewController: UIScrollViewController<Content>, context: Context) {
viewController.hostingController.rootView = self.content()
}
}
class UIScrollViewController<Content: View>: UIViewController, UIScrollViewDelegate {
var axis: DirectionX = .horizontal
var numberOfPages: Int = 0
var pagingEnabled: Bool = false
var pageControlEnabled: Bool = false
var hideScrollIndicators: Bool = false
lazy var scrollView: UIScrollView = {
let view = UIScrollView()
view.delegate = self
view.isPagingEnabled = pagingEnabled
view.showsVerticalScrollIndicator = !hideScrollIndicators
view.showsHorizontalScrollIndicator = !hideScrollIndicators
return view
}()
lazy var pageControl : UIPageControl = {
let pageControl = UIPageControl()
pageControl.numberOfPages = numberOfPages
pageControl.currentPage = 0
pageControl.tintColor = UIColor.white
pageControl.pageIndicatorTintColor = UIColor.gray
pageControl.currentPageIndicatorTintColor = UIColor.white
pageControl.translatesAutoresizingMaskIntoConstraints = false
pageControl.isHidden = !pageControlEnabled
return pageControl
}()
init(rootView: Content) {
self.hostingController = UIHostingController<Content>(rootView: rootView)
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
var hostingController: UIHostingController<Content>! = nil
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(scrollView)
self.makefullScreen(of: self.scrollView, to: self.view)
self.hostingController.willMove(toParent: self)
self.scrollView.addSubview(self.hostingController.view)
self.makefullScreen(of: self.hostingController.view, to: self.scrollView)
self.hostingController.didMove(toParent: self)
view.addSubview(pageControl)
pageControl.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -50).isActive = true
pageControl.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
pageControl.heightAnchor.constraint(equalToConstant: 60).isActive = true
pageControl.widthAnchor.constraint(equalToConstant: 200).isActive = true
}
func makefullScreen(of viewA: UIView, to viewB: UIView) {
viewA.translatesAutoresizingMaskIntoConstraints = false
viewB.addConstraints([
viewA.leadingAnchor.constraint(equalTo: viewB.leadingAnchor),
viewA.trailingAnchor.constraint(equalTo: viewB.trailingAnchor),
viewA.topAnchor.constraint(equalTo: viewB.topAnchor),
viewA.bottomAnchor.constraint(equalTo: viewB.bottomAnchor),
])
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let currentIndexHorizontal = round(scrollView.contentOffset.x / self.view.frame.size.width)
let currentIndexVertical = round(scrollView.contentOffset.y / self.view.frame.size.height)
switch axis {
case .horizontal:
self.pageControl.currentPage = Int(currentIndexHorizontal)
break
case .vertical:
self.pageControl.currentPage = Int(currentIndexVertical)
break
default:
break
}
}
}
打开手册,找到正确的章节。对于我们的指令,MOV(立即)为A6.7.40-您可以看到指令框架如下所示:
位15:11- 0b00100
位10:8- Rd
位7:0- imm8
您必须在 Rd 字段中指定目标寄存器,并在 imm8 字段中输入要输入的值。在我们的情况下,Rd为r0,因此Rd = 0b000,值为10,因此imm8 = 0b00001010,编码后的整个指令为0b0010000000001010 = 0x200A
答案 3 :(得分:0)
我将重点关注以下问题:当我们说计算机只理解二进制时,我们是什么意思
首先让我们举个例子
假设您必须在机器中存储字母“ g” 首先,我们将其转换为103的ASCII值 现在二进制等效的103是1100111
现在我们没有任何机制可以将此数字存储在计算机中。
我们找到了一种使用机器或换句话说收集电线的方式来记住这一点的方法
我们放置了7条平行线,并让电流从看到1的电线中流出,而其他电线则没有电流,具体按照位出现的顺序,即0或1
现在,每次我看到这种模式时,我就知道这是英文字母g。
现在,我们可以假设存储设备或处理器是由这样的电线组成的庞大网络,这些电线被协同布置以使我们的逻辑正常工作
请注意,我采取了一种过于简化的方法,只是它使它更加灵活,而且如其他答案中所述,显然实际的实现显然要复杂得多,但基线保持不变
希望这会有所帮助