我有一本书,名叫《Zen of Assembly》,作者是 Michael Abrash。据我所知,所有代码清单都在 x86 汇编中。我下载了 WinASM 和 MASM,这样我就可以组装并链接这些列表。然而,这些列表并不是开箱即用的——事实上,我根本无法让它们工作。例如,以下是第一个清单的代码:
;
; *** Listing 2-1 ***
;
; The precision Zen timer (PZTIMER.ASM)
;
; Uses the 8253 timer to time the performance of code that takes
; less than about 54 milliseconds to execute, with a resolution
; of better than 10 microseconds.
;
; By Michael Abrash 4/26/89
;
; Externally callable routines:
;
; ZTimerOn: Starts the Zen timer, with interrupts disabled.
;
; ZTimerOff: Stops the …Run Code Online (Sandbox Code Playgroud) 我使用以下代码创建了一个简单的 C++ 源文件:
int main() {
int a = 1;
int b = 2;
if(a < b) {
return 1;
}
else if(a > b) {
return 2;
}
else {
return 3;
}
}
Run Code Online (Sandbox Code Playgroud)
我使用objdump命令来获取上述源代码的汇编代码。
该行int b = 2;已转换为mov DWORD PTR [rbp-0x4], 0x2.
其对应的机器码为C7 45 FC 02 00 00 00(十六进制格式)。
我想知道如何将汇编代码转换为二进制代码。我浏览了 x86-64 的英特尔参考手册,但我无法理解它,因为我是低级编程的新手。
所以我有2个寄存器,eax一个保存0xDEADC0DE,ebx另一个保存0x1337CA5E。
第一个数字比第二个数字大。然而,在cmp指令之后:(符号cmp eax, ebx标志SF)被设置。为什么 ?
为什么结果是正(eax- ebx)?
所以我得到了 2 个 8 位数字,我们称它们为a和b。如果前 3 位相同(因此是最重要的那些),我需要汇编程序(带有 16 位寄存器的 emu8086)对它们执行一些操作(我认为如果达到那个点我可以处理)。
我是组装新手,但最直接的解决方案似乎是XOR,因为XOR将为相同的输入提供 0 (0 xor 0 = 0, 1 xor 1 = 0) 和 1 对于不同的输入。
但是我怎么能做到 2 个字节呢?是否可以将它们中的每一个视为一个数组并逐位“比较”它们并将结果存储XOR在其他寄存器中?然后我怎样才能“隔离”这个结果的 3 个最重要的位?
我在Mac OS上玩x86-64程序集(使用NASM 2.09和2.13,以捕获由NASM问题引起的错误)。我目前正在尝试实现函数调用,并尝试使用push和pop指令,但pop始终似乎会导致段错误:
line 10: 41072 Segmentation fault: 11 ./result
我尝试手动调整rsp,rbp等等,但这pop似乎是问题所在。任何帮助,将不胜感激!
section .data
default rel
global start
section .text
start:
mov r12, 4
push r12
call label_0_print_digit
(some stuff to exit program)
label_0_print_digit:
pop r12
(some stuff to print the digit - the issue persists even without this)
ret
Run Code Online (Sandbox Code Playgroud) 我是汇编编程(x86 32 位架构)的新手,对以下代码有疑问:
SECTION .data
Msg: db "Hello", 10
Len: equ $-Msg
SECTION .text
global _start
_start:
; Printing Msg to stdout
mov eax, 4
mov ebx, 1
mov ecx, Msg ; Passing the ADDRESS to the beginning of what's stored in Msg
mov edx, Len ; Are we passing the address of Len, or the value of Len?
int 80H
; Terminating
mov eax, 1
mov ebx, 0
int 80H
Run Code Online (Sandbox Code Playgroud)
有人告诉我,mov ecx, Msg指令将Msg存储位置的地址移动到ecx寄存器中。 …
哲学家进餐问题是一个经典的计算机科学教科书问题,用于演示多线程的使用。正如维基百科所说:
五位沉默的哲学家端着一碗意大利面坐在圆桌旁。叉子放在每对相邻的哲学家之间。
每个哲学家都必须交替思考和进食。但是,哲学家只有在左叉和右叉同时拥有时才能吃意大利面。每个叉子只能由一个哲学家持有,因此只有当叉子没有被其他哲学家使用时,哲学家才能使用它。在一个哲学家吃完饭后,他们需要放下两个叉子,以便其他人可以使用这些叉子。哲学家只能在有可用的时候拿走他们右边或左边的叉子,并且在拿到两把叉子之前他们不能开始吃饭。
进食不受剩余意大利面条或胃空间的限制;假设无限供给和无限需求。
问题是如何设计行为准则(并发算法),使哲学家不会挨饿;即,每个人都可以永远继续在吃饭和思考之间交替,假设没有哲学家可以知道其他人什么时候想吃饭或思考。
该问题旨在说明避免死锁的挑战,死锁是一种不可能取得进展的系统状态。
总之,这是多线程中的一个经典问题,表明需要使用互斥原则来避免资源匮乏。
我想在实模式 DOS 中实现这样的程序,但是 DOS 显然缺乏多线程功能。
我知道第三方软件,例如RTKernel,但这对于这种情况似乎有点过分。
是否有任何模拟多线程的解决方案,以便我可以使用 16 位 x86 汇编语言在 DOS 中对哲学家进餐问题的模拟进行编程?
我想知道如何进入 Commodore 64 上的程序集编辑器。您输入命令吗?
我在 YouTube 上看到过这种情况,但发生得太快了,我跟不上!
2 Print "What is your name"
input nameperson$
Print "What is your Dad's name"
input ageperson$
Print "Your Name is ";nameperson$;" ";ageperson$
GOTO 2
Run Code Online (Sandbox Code Playgroud)
为什么这段代码在 BASIC 256 中不起作用?我已经在QB64中尝试过并且有效。
这个youtube视频展示了一个程序的虚拟内存的布局,它包括以下从高内存地址到低内存地址的段。
这些片段的排列总是如此吗?它们是否独立于计算机使用的计算机架构?
要检查 gdb 中每个段的地址,有人可以告诉我该怎么做吗?
以下面的C程序为例:
#include <stdio.h>
int main() {
printf("Hello World!\n");
}
Run Code Online (Sandbox Code Playgroud)