小编Sep*_*and的帖子

WinASM 和“Zen of Assembly”的问题(书籍)

我有一本书,名叫《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)

x86 assembly x86-16

1
推荐指数
1
解决办法
1565
查看次数

如何将汇编代码转换为二进制代码?

我使用以下代码创建了一个简单的 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 的英特尔参考手册,但我无法理解它,因为我是低级编程的新手。

binary assembly x86-64 instruction-encoding

1
推荐指数
1
解决办法
4568
查看次数

装配SF标志

所以我有2个寄存器,eax一个保存0xDEADC0DE,ebx另一个保存0x1337CA5E。

第一个数字比第二个数字大。然而,在cmp指令之后:(符号cmp eax, ebx标志SF)被设置。为什么 ?

为什么结果是正(eax- ebx)?

x86 assembly flags

1
推荐指数
1
解决办法
1万
查看次数

用汇编语言对 2 个字节进行异或运算

所以我得到了 2 个 8 位数字,我们称它们为ab如果前 3 位相同(因此是最重要的那些),我需要汇编程序(带有 16 位寄存器的 emu8086)对它们执行一些操作(我认为如果达到那个点我可以处理)。

我是组装新手,但最直接的解决方案似乎是XOR,因为XOR将为相同的输入提供 0 (0 xor 0 = 0, 1 xor 1 = 0) 和 1 对于不同的输入。

但是我怎么能做到 2 个字节呢?是否可以将它们中的每一个视为一个数组并逐位“比较”它们并将结果存储XOR在其他寄存器中?然后我怎样才能“隔离”这个结果的 3 个最重要的位?

assembly xor x86-16 emu8086

1
推荐指数
1
解决办法
1173
查看次数

为什么在这段汇编代码中调用“ pop”会导致分段错误?

我在Mac OS上玩x86-64程序集(使用NASM 2.09和2.13,以捕获由NASM问题引起的错误)。我目前正在尝试实现函数调用,并尝试使用pushpop指令,但pop始终似乎会导致段错误:

line 10: 41072 Segmentation fault: 11 ./result

我尝试手动调整rsprbp等等,但这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)

assembly x86-64 nasm

1
推荐指数
1
解决办法
61
查看次数

用于打印到标准输出的 `mov edx, Len` 是否将“Len”的值或地址存储到寄存器中?

我是汇编编程(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寄存器中。 …

x86 assembly nasm cpu-registers

1
推荐指数
1
解决办法
153
查看次数

有没有办法在 DOS 中模拟多线程,例如,在解决哲学家就餐的问题时?

哲学家进餐问题是一个经典的计算机科学教科书问题,用于演示多线程的使用。正如维基百科所说

五位沉默的哲学家端着一碗意大利面坐在圆桌旁。叉子放在每对相邻的哲学家之间。

每个哲学家都必须交替思考和进食。但是,哲学家只有在左叉和右叉同时拥有时才能吃意大利面。每个叉子只能由一个哲学家持有,因此只有当叉子没有被其他哲学家使用时,哲学家才能使用它。在一个哲学家吃完饭后,他们需要放下两个叉子,以便其他人可以使用这些叉子。哲学家只能在有可用的时候拿走他们右边或左边的叉子,并且在拿到两把叉子之前他们不能开始吃饭。

进食不受剩余意大利面条或胃空间的限制;假设无限供给和无限需求。

问题是如何设计行为准则(并发算法),使哲学家不会挨饿;即,每个人都可以永远继续在吃饭和思考之间交替,假设没有哲学家可以知道其他人什么时候想吃饭或思考。

该问题旨在说明避免死锁的挑战,死锁是一种不可能取得进展的系统状态。

总之,这是多线程中的一个经典问题,表明需要使用互斥原则来避免资源匮乏。

我想在实模式 DOS 中实现这样的程序,但是 DOS 显然缺乏多线程功能。

我知道第三方软件,例如RTKernel,但这对于这种情况似乎有点过分。

是否有任何模拟多线程的解决方案,以便我可以使用 16 位 x86 汇编语言在 DOS 中对哲学家进餐问题的模拟进行编程?

x86 assembly multithreading dos dining-philosopher

1
推荐指数
1
解决办法
85
查看次数

如何从 C64 BASIC 访问汇编编辑器

我想知道如何进入 Commodore 64 上的程序集编辑器。您输入命令吗?

我在 YouTube 上看到过这种情况,但发生得太快了,我跟不上!

assembly basic editor c64

1
推荐指数
1
解决办法
430
查看次数

为什么这个 GOTO 在 BASIC 256 中不起作用?

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中尝试过并且有效。

basic goto qbasic

1
推荐指数
1
解决办法
350
查看次数

在 gdb 中显示段地址

这个youtube视频展示了一个程序的虚拟内存的布局,它包括以下从高内存地址到低内存地址的段。

  • 核心
  • 堆栈(从高地址向低地址增长)
  • 堆(从低地址增长到高地址)
  • 数据
  • 文本

这些片段的排列总是如此吗?它们是否独立于计算机使用的计算机架构?

要检查 gdb 中每个段的地址,有人可以告诉我该怎么做吗?
以下面的C程序为例:

#include <stdio.h>

int main() {
    printf("Hello World!\n");
}
Run Code Online (Sandbox Code Playgroud)

assembly linker gdb segment

1
推荐指数
1
解决办法
95
查看次数