小编Fif*_*nik的帖子

Initializing variables in an "if" statement

I read that in C++17 we can initialize variables in if statements like this

if (int length = 2; length == 2)
    //execute something
Run Code Online (Sandbox Code Playgroud)

Instead of

int length = 2;
if (length == 2)
    //do something
Run Code Online (Sandbox Code Playgroud)

Even though it is shorter, it affects the code readability (especially for people who don't know this new feature), which I suppose is a bad coding practice for large software development.

除了使代码更短之外,使用此功能还有什么好处?

c++ c++17

78
推荐指数
6
解决办法
4834
查看次数

CPU如何区分'CALL rel16'(E8 cw)和'CALL rel32'(E8 cd)?

CPU如何区分CALL rel16(E8 cw)和CALL rel32(E8 cd)?

根据这个网站,镜像英特尔架构手册,为操作码CALL rel16CALL rel32E8 cwE8 cd分别.

这让我很奇怪,CPU如何区分这些操作码,因为它E8 cw可能是一个前缀E8 cw

x86 assembly isa

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

将有符号数与无符号数相乘时,应该使用“mul”还是“imul”?

我发现 和 都mul可以imul用来将有符号数乘以无符号数。

例如:

global _start

section .data
    byteVariable DB -5

section .text
_start:

mov al, 2
imul BYTE [byteVariable]
Run Code Online (Sandbox Code Playgroud)

可以用 替换imulmul结果还是一样(-10)。

有符号数与无符号mul数相乘时和imul完全相同,还是有区别?

x86 assembly unsigned signed multiplication

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

CS寄存器在启动时的值是多少?

我是汇编语言的绿手.这些天我用bochs来模拟虚拟软盘的启动过程.但我不知道的一件事CS是系统初始化时寄存器值是什么.

;;  init registers

org 0x7c00

BaseOfStack equ 0x7c00

Label_Start:

mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
mov sp, BaseOfStack

;; clear screen

mov ax, 0600h
mov bx, 0700h
mov cx, 0
mov dx, 0184h
int 10h
Run Code Online (Sandbox Code Playgroud)

上面的代码只是其中的一部分.ORG执行命令时,指令的CS寄存器值是多少mov ax, cs.它与0x7c00相同吗?谢谢.

下面是bochsrc配置:

romimage: file="$BXSHARE/BIOS-bochs-latest"
vgaromimage: file="$BXSHARE/VGABIOS-lgpl-latest"
boot: floppy
floppy_bootsig_check: disabled=0
floppya: type=1_44, 1_44="myboot.img", status=inserted
pci: enabled=1, chipset=i440fx
vga: extension=vbe, update_freq=15
cpu: ips=15000000
log: bochsout.txt
mouse: enabled=0 …
Run Code Online (Sandbox Code Playgroud)

boot assembly bios bochs x86-16

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

在NASM中划分两个数字

开始自学组装(NASM)我想知道如何划分2个数字(例如在Windows上).

我的代码看起来像这样,但它崩溃了.

global _main
extern _printf

section .text

_main:

mov eax, 250
mov ebx, 25
div ebx
push ebx
push message 

call _printf
add esp , 8
ret

message db "Value is = %d", 10 , 0
Run Code Online (Sandbox Code Playgroud)

我想知道什么是真的错了?它甚至不显示除法后的值.

x86 assembly nasm integer-division

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

如何在两个不同的DOSBox上同时播放声音?

我已经在程序集8086中创建了“愤怒的小鸟”游戏。我现在的主要问题是我想在主循环运行时播放游戏的歌曲。我已经写了音乐代码。我考虑过使用多线程,但发现用于创建线程的程序集中断仅适用于cmd,不适用于DOSBox。

但是,我发现执行多线程的另一种方法是从C ++ Windows.h文件调用一个创建线程的命令。那太复杂了。

现在,我设法使用中断14h通过LAN端口发送消息,从而在两个不同的DOSBox窗口之间进行通信。基本上,我已经为音乐编写了单独的代码。这两个代码都运行,并且只有当音乐代码获得符号时,它才开始播放音乐。

但是,我发现打开两个DOSBox窗口时,只有主要的声音起作用。您必须切换窗口才能收听音乐,这意味着您听不到声音。

有没有人知道如何解决这个问题,或者在主循环运行时播放音乐?

谢谢

assembly background-music dosbox x86-16

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

在8位字段上比在32位字段上使用CMPXCHG指令在任何方面是否更糟?

我想问一下CMPXCHG在8位内存字段上使用指令是否比在32位字段上使用指令更糟糕。

我正在使用C11 stdatomic.h来实现一些同步方法。

c x86 assembly instruction-set c11

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

为什么 fp 除法运算比倒数运算加乘法运算慢

根据 Agner 的指令表,单个 fp 除法比单个倒数操作和单个乘法操作慢。(这在所测量的 x86 架构中似乎很常见)

这是打桩机架构表的摘录。

MULSS MULSD    x,x/m    1  5-6   0.5   P01  fma
MULPS MULPD    x,x/m    1  5-6   0.5   P01  fma
VMULPS VMULPD  y,y,y/m  2  5-6   1     P01  fma
DIVSS DIVPS    x,x/m    1  9-24  5-10  P01  fp
VDIVPS         y,y,y/m  2  9-24  9-20  P01  fp
DIVSD DIVPD    x,x/m    1  9-27  5-10  P01  fp
VDIVPD         y,y,y/m  2  9-27  9-18  P01  fp
RCPSS/PS       x,x/m    1  5     1     P01  fp
Run Code Online (Sandbox Code Playgroud)

第四个值是延迟。因此,乘法运算需要 5-6 个周期,除法运算需要 9-24 个周期,而倒数运算则需要 5 个周期。由于 24 > …

floating-point performance x86 assembly

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

x86寄存器标志缩写

我正在学习汇编语言.

在Microsoft Visual Studio 2017中,我想检查寄存器标志的当前状态.

在此输入图像描述

我想知道每个寄存器标志的缩写代表什么,所以我在x86寄存器标志上查看wiki页面.

在此输入图像描述

但正如您所看到的,Visual Studio中显示的寄存器标志缩写与Wiki页面中的缩写不匹配.

对于visual studio中的注册标志,我如何找出它们代表什么?

x86 assembly masm eflags

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

从另一个文件调用过程

我有一个 .ASM 文件,我想在其中调用另一个 .ASM 或 .INC 文件中的过程。
我尝试将以下内容写入我的main.asm文件中:

INCLUDE file_op.inc
Run Code Online (Sandbox Code Playgroud)

然而,当我尝试运行它时,它只是说:

“模拟器已停止。”

当它第一次遇到另一个文件中指定的过程时,它会执行此操作。

另一个 .INC 文件中的过程是:

; A function to open a file using its name and remember its file_handle 
open_file       proc
                mov ax, 3d00h           ; System call to open a file
                lea dx, file_name       ; name of the file we are opening
                int 21h                 ; system interrupt
                mov file_handle, ax     ; remember file_handle!!
                ret
                endp

; A function to read from a file byte by byte using …
Run Code Online (Sandbox Code Playgroud)

assembly dos tasm x86-16 emu8086

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