小编Sep*_*and的帖子

当 UTF-8 压入堆栈时,是否使用与 UTF-32 相同的内存量?

问题具体在于 UTF-8 在堆栈上占用了多少空间,因此在内存 (RAM) 中占用了多少空间,例如:它与 UTF-32 相同吗?因此,这与 UTF-8 序列化为文件时占用多少磁盘空间无关。如果这种消除歧义的尝试侮辱了你的智力,我很抱歉。

  • 堆栈始终位于 RAM 中。所以我放入堆栈的任何内容都会占用 RAM 中的空间。

/sf/ask/1080337331/#:~:text=Stack%20is%20always%20in%20RAM,at%20the%20top%20of%20stack

  • 堆栈在 x86 上至少为 32 位,在 x86_64 上至少为 64 位。因此,无论我将一字节字符还是三字节字符压入堆栈,它们都至少占用内存中的 32 位。我想这就是 UTF-32 所发生的情况,它在堆栈上占用 32 位。

当我不指定操作数大小时,push 指令将多少字节压入堆栈?

那么,当他们说 UTF-32 比 UTF-8 占用更多内存时,他们是什么意思呢?

编辑

UTF-32 使用更多内存,但当今的计算机配备了大量内存。节省内存的压力消失了,简单快速地处理 UTF-32 字符串超过了增加的内存使用量。与任何试图通过检查字符串来节省内存的方法相比,使用 UTF-32 可以使程序运行得更快。

https://seed7.sourceforge.net/faq.htm#unicode

unicode x86 assembly utf-8 nasm

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

从程序集中捕获/禁用 SIGFPE 异常

在使用 .x86 程序集除以 0 时,出现 SIGFPE 异常idiv。我如何从汇编中禁用它?我需要系统调用还是可以直接在 x86 中完成?

再生产:

测试.asm

default rel
global WinMain

section .data 

section .text
WinMain:
    mov rcx, 0
    mov rdx, 0
    idiv rcx
Run Code Online (Sandbox Code Playgroud)

命令:

nasm -f win64 test.asm
gcc test.obj
gdb a
运行

x86 assembly x86-64 integer-division

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

数组中对应值的乘法

我想编写一个x86程序,该程序将2个数组的相应元素(array1[0]*array2[0]依此类推,直到5个元素)相乘,并将结果存储在第三个数组中。我什至不知道从哪里开始。任何帮助是极大的赞赏。

arrays x86 assembly multiplication

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

MASM:如何解决错误“不允许立即操作数”

我的汇编程序具有以下结构:

BPB_FAT16   STRUCT                     ; Base BPB_FAT16. Size=0x19=25.
BytesPerSector      DW  0x0200 ; Size of HW sector, usualy 512.
SectorsPerCluster   DB  0x01   ; Valid values 1,2,4,8,16,32,64,128.
ReservedSectors     DW  0x0001 ; NrOfSectors preceding FAT.
NumberOfFats        DB  0x02   ;
RootEntries         DW  0x00E0 ; Max number of YWORD entries in the 
                               ;root dir.
SmallSectors        DW  0x0B40 ; See also .LargeSectors.
MediaDescriptor     DB  0xF0   ; 0xF0 floppy disk, 0xF8 hard disk.
SectorsPerFat       DW  0x0009 ;
SectorsPerTrack     DW  0x0012 ;
NumberOfHeads       DW  0x0002 ;
HiddenSectors       DW 0x00000000 …
Run Code Online (Sandbox Code Playgroud)

x86 assembly masm bootloader data-structures

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

典型的贪吃蛇游戏。如何追踪蛇的踪迹?

这个棋盘游戏的目标是吃掉食物并成长。

在最基本的形式中,游戏仅使用 3 种颜色:一种用于蛇(一系列互连的图块),一种用于食物(随机选择的图块),一种用于背景(未占用的图块)。因为蛇是不断移动的,所以任何时候蛇头在哪里都会很明显。不需要任何图形标记。玩家可以通过键盘上的方向键控制蛇,瞄准食物。如果食物被吃掉,蛇会额外长出一段,并且接下来的食物会被放置在棋盘上。如果蛇撞到边界或撞到自己,游戏就结束了!

为了使蛇移动,在“头”侧添加一个新段,并在“尾”侧删除现有段。在程序中,我们可以将“头”和“尾”的坐标存储在变量中。更新“head”变量很容易,但是我们如何才能明确地知道新的“tail”在哪里呢?那么,我们该如何追踪蛇呢?是否有必要发明一些数据结构?

windows assembly dos x86-16

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

当操作数具有相同大小时,为什么 MOVZX 不起作用?

使用Z2 dword ?,mov eax, Z2工作正常,但movzx eax, Z2会出现“无效指令操作数”错误。

我在这里有点困惑:即使Z2的大小与 相同eax,为什么程序集不能接受movzx这个?似乎movzx特别希望操作数的大小不同。

设计这样的指令的原因可能是什么?

如果它被设计为简单地允许相同大小的操作数,那么编码不是更容易吗?

x86 assembly masm instruction-set mov

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

使用每个标签地址,.o 文件的总大小会增加 24 个字节(加上 8 个字节(总共 32 个字节))

在我的 FASM 项目(对象)中,我尝试创建一个跳转表并用于dq每个跳转地址,但有一个问题!
对于每个dq .jmp1(跳转地址定义),.jmp1我的最终 .o 文件的总大小将添加 24 个字节(加上地址的 8 个字节(总共 32 个字节))!
那额外的 24 个字节是什么?有什么办法可以避免吗?这种情况仅发生在目标文件中,而不发生在可执行文件中!

它定义了 32 个字节,而不是每个跳转地址 8 个字节!问题是什么?

format ELF64

section '.text'

func:
        lea     rax, [8*rax+.jmp_table]

 .jmp1:

 .jmp_table:
        dq .jmp1 ; 8 bytes + 24 bytes !!! (to .o total size)
        dq .jmp1 ; 8 bytes + 24 bytes !!! (to .o total size)   
Run Code Online (Sandbox Code Playgroud)

但是当我创建一个可执行文件时,每个文件dq只需要 8 个字节(这是我所期望的)......

format ELF64 EXECUTABLE

segment readable executable

func:
        lea     rax, [8*rax+.jmp_table]

 .jmp1:

 .jmp_table: …
Run Code Online (Sandbox Code Playgroud)

assembly executable x86-64 object-files fasm

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

汇编中函数之间的参数传递如何进行?

所以我试图了解汇编编程如何与堆栈框架等一起工作。
我做了一些练习并使用 GDB 反汇编了一些 C 代码。现在的任务是找出“main”和函数之间的参数传输是如何工作的。我刚刚开始学习,有点迷失了下一个例子实际上在做什么。关于从哪里开始有什么想法或建议吗?

这是一个与教师合作的递归程序。

汇编代码如下所示:

    1149:   f3 0f 1e fa             endbr64 
    114d:   55                      push   rbp
    114e:   48 89 e5                mov    rbp,rsp
    1151:   48 83 ec 10             sub    rsp,0x10
    1155:   89 7d fc                mov    DWORD PTR [rbp-0x4],edi
    1158:   83 7d fc 01             cmp    DWORD PTR [rbp-0x4],0x1
    115c:   76 13                   jbe    1171 <f+0x28>
    115e:   8b 45 fc                mov    eax,DWORD PTR [rbp-0x4]
    1161:   83 e8 01                sub    eax,0x1
    1164:   89 c7                   mov    edi,eax
    1166:   e8 de ff ff ff          call …
Run Code Online (Sandbox Code Playgroud)

c recursion assembly x86-64 disassembly

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

给出每条指令的操作码和代码字节数

我目前正在上一门低级编程课程,不幸的是,我在我们的教科书中找不到这些信息(大多数问题都没有包含在我们的课本中)。我很难确定如何解决这些问题。没有关于“CPU 或任何类似的东西”的信息。问题如下:

给出每条指令的操作码和代码字节数。
(a) mov exc, 984 Op Code_____ 字节数_____
(b) xchg eax, ecx Op Code_____ 字节数_____

还有很多,但如果有人能帮助我理解如何做这两个,我希望能够将其转化为其他问题。

我尝试过一件事,但不确定我看到了什么:我在 Visual Studio 2019 中创建了一个小的 *.asm 项目,并在 (a) 中添加了一行代码并查看了列表文件。我看到它显示以下内容:

00000000  B9 000003D8         mov  ecx, 984   
Run Code Online (Sandbox Code Playgroud)

我不确定是否可以在这里找到这些信息,我只是错过了它,或者有其他方法可以解决这个问题。

x86 assembly instruction-encoding

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

在 Intel 32 位汇编中数组被打印为 0

我编写了一个程序并初始化了一个数组,例如var WORD 50 DUP(?).
当我尝试循环并打印var的值时,它打印了零。

.data
var WORD 50 DUP(?)
.code
main PROC
mov ecx,10
top:
movzx eax,var
call writeint
loop top
Run Code Online (Sandbox Code Playgroud)

arrays x86 assembly cpu-registers

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

这个编码答案看起来不错吗?

在学校里,我被告知要描述机器语言、汇编语言和高级计算机语言之间的区别。

给出机器语言代码和汇编语言代码的例子,然后命名两种高级语言

这是我的回答:

“机器和汇编由计算机直接执行的指令组成。高级是比机器语言更接近英语的编程语言。对于机器代码,我的例子是二进制,如 1101 或 1001。C 是一种汇编语言代码。Java 和 Python 是高级语言。”

assembly machine-code high-level

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