问题具体在于 UTF-8 在堆栈上占用了多少空间,因此在内存 (RAM) 中占用了多少空间,例如:它与 UTF-32 相同吗?因此,这与 UTF-8 序列化为文件时占用多少磁盘空间无关。如果这种消除歧义的尝试侮辱了你的智力,我很抱歉。
/sf/ask/1080337331/#:~:text=Stack%20is%20always%20in%20RAM,at%20the%20top%20of%20stack。
那么,当他们说 UTF-32 比 UTF-8 占用更多内存时,他们是什么意思呢?
编辑
UTF-32 使用更多内存,但当今的计算机配备了大量内存。节省内存的压力消失了,简单快速地处理 UTF-32 字符串超过了增加的内存使用量。与任何试图通过检查字符串来节省内存的方法相比,使用 UTF-32 可以使程序运行得更快。
在使用 .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程序,该程序将2个数组的相应元素(array1[0]*array2[0]依此类推,直到5个元素)相乘,并将结果存储在第三个数组中。我什至不知道从哪里开始。任何帮助是极大的赞赏。
我的汇编程序具有以下结构:
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) 这个棋盘游戏的目标是吃掉食物并成长。
在最基本的形式中,游戏仅使用 3 种颜色:一种用于蛇(一系列互连的图块),一种用于食物(随机选择的图块),一种用于背景(未占用的图块)。因为蛇是不断移动的,所以任何时候蛇头在哪里都会很明显。不需要任何图形标记。玩家可以通过键盘上的方向键控制蛇,瞄准食物。如果食物被吃掉,蛇会额外长出一段,并且接下来的食物会被放置在棋盘上。如果蛇撞到边界或撞到自己,游戏就结束了!
为了使蛇移动,在“头”侧添加一个新段,并在“尾”侧删除现有段。在程序中,我们可以将“头”和“尾”的坐标存储在变量中。更新“head”变量很容易,但是我们如何才能明确地知道新的“tail”在哪里呢?那么,我们该如何追踪蛇呢?是否有必要发明一些数据结构?
使用Z2 dword ?,mov eax, Z2工作正常,但movzx eax, Z2会出现“无效指令操作数”错误。
我在这里有点困惑:即使Z2的大小与 相同eax,为什么程序集不能接受movzx这个?似乎movzx特别希望操作数的大小不同。
设计这样的指令的原因可能是什么?
如果它被设计为简单地允许相同大小的操作数,那么编码不是更容易吗?
在我的 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) 所以我试图了解汇编编程如何与堆栈框架等一起工作。
我做了一些练习并使用 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) 我目前正在上一门低级编程课程,不幸的是,我在我们的教科书中找不到这些信息(大多数问题都没有包含在我们的课本中)。我很难确定如何解决这些问题。没有关于“CPU 或任何类似的东西”的信息。问题如下:
给出每条指令的操作码和代码字节数。
(a) mov exc, 984 Op Code_____ 字节数_____
(b) xchg eax, ecx Op Code_____ 字节数_____
还有很多,但如果有人能帮助我理解如何做这两个,我希望能够将其转化为其他问题。
我尝试过一件事,但不确定我看到了什么:我在 Visual Studio 2019 中创建了一个小的 *.asm 项目,并在 (a) 中添加了一行代码并查看了列表文件。我看到它显示以下内容:
Run Code Online (Sandbox Code Playgroud)00000000 B9 000003D8 mov ecx, 984
我不确定是否可以在这里找到这些信息,我只是错过了它,或者有其他方法可以解决这个问题。
我编写了一个程序并初始化了一个数组,例如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) 在学校里,我被告知要描述机器语言、汇编语言和高级计算机语言之间的区别。
给出机器语言代码和汇编语言代码的例子,然后命名两种高级语言
这是我的回答:
“机器和汇编由计算机直接执行的指令组成。高级是比机器语言更接近英语的编程语言。对于机器代码,我的例子是二进制,如 1101 或 1001。C 是一种汇编语言代码。Java 和 Python 是高级语言。”
assembly ×11
x86 ×7
x86-64 ×3
arrays ×2
masm ×2
bootloader ×1
c ×1
disassembly ×1
dos ×1
executable ×1
fasm ×1
high-level ×1
machine-code ×1
mov ×1
nasm ×1
object-files ×1
recursion ×1
unicode ×1
utf-8 ×1
windows ×1
x86-16 ×1