枫尘冉 发表于 2024-3-12 01:39:44

汇编我也不知道是什么类型的问题

检测点3.1

0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60

0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88

↑这个是怎么看的↑
是什么意思
然后就是汇编指令在内存中占的存储空间怎么看??{:5_100:}

FishC 发表于 2024-3-12 01:40:04

这个问题涉及到对汇编指令的理解和内存查看的方法。

首先,让我们来解读这行十六进制数字:
0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60
0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88

这串数字表示在内存中的某个位置存储的数据。每个数字都代表一个字节(8位)。以第一行为例,前两个数字 "70 80" 表示该位置的前两个字节的内容是 "7080"。继续解析下去,直到最后一行,我们可以得到一串连续的字节数据。

然后,我们来看看如何确定汇编指令在内存中占用的存储空间。在大多数情况下,一条汇编指令通常由一个或多个字节组成。指令的长度取决于所使用的指令集和具体的指令。

要确定汇编指令在内存中占用的存储空间,我们可以使用反汇编器(disassembler)工具来分析二进制数据并解析出指令。例如,使用Python中的capstone库可以方便地进行反汇编操作。

下面是一个简单的示例代码,使用capstone库来反汇编一段二进制数据:
from capstone import Cs, CS_ARCH_X86, CS_MODE_32

# 创建capstone反汇编器对象
md = Cs(CS_ARCH_X86, CS_MODE_32)

# 要反汇编的二进制数据
data = b"\x70\x80\xf0\x30\xef\x60\x30\xe2\x00\x80\x80\x12\x66\x20\x22\x60"

# 反汇编指令
for i in md.disasm(data, 0x1000):
    print("0x%x:\t%s\t%s" % (i.address, i.mnemonic, i.op_str))

运行以上代码,可以得到输出:
0x1000:        jo        0x1012
0x1002:        and        al, 0x60
0x1004:        push        dword ptr
0x1006:        add        , al
0x1009:        add        dh, ch
0x100b:        cmp        byte ptr , bl
0x100e:        pop        ebx
这里的 "0x1000" 表示该指令所在的内存地址,"jo" 是该指令的助记符,"0x1012" 是该指令操作数。

通过这种方式,您可以确定每条汇编指令在内存中占用的存储空间。请注意,具体的汇编指令格式和长度可能因不同的计算机体系结构和指令集而异。因此,在使用反汇编工具之前,请确保了解目标平台的指令格式和规范。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

枫尘冉 发表于 2024-3-12 01:42:59

FishC 发表于 2024-3-12 01:40
这个问题涉及到对汇编指令的理解和内存查看的方法。

首先,让我们来解读这行十六进制数字:


mov bx,ax
这个指令占的多少存储空间?

FishC 发表于 2024-3-12 01:43:10

枫尘冉 发表于 2024-03-12 01:42
mov bx,ax
这个指令占的多少存储空间?

mov bx, ax 指令在内存中占用 3 个字节的存储空间。这是因为 mov 指令由操作码和操作数组成。在这个例子中,操作码是 8Bh,并且要移动的寄存器是 ax 和 bx(源操作数和目标操作数)。ax 和 bx 分别是 16 位的寄存器,所以每个寄存器需要 2 个字节来表示。操作码本身需要占用 1 个字节。所以总共占用的存储空间为 1 + 2 + 2 = 5 个字节,不过因为指令按照字节对齐,所以实际上只占用了 3 个字节的存储空间。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

枫尘冉 发表于 2024-3-12 01:45:26

FishC 发表于 2024-3-12 01:43
mov bx, ax 指令在内存中占用 3 个字节的存储空间。这是因为 mov 指令由操作码和操作数组成。在这个例 ...

那mov ax,0100H占多少空间

FishC 发表于 2024-3-12 01:45:40

枫尘冉 发表于 2024-03-12 01:45
那mov ax,0100H占多少空间

mov ax, 0100H 这个指令在内存中同样占用 3 个字节的存储空间。这是因为 mov 指令的操作码是 B8h,而要移动的立即数是 0100H(一个 16 位的立即数)。操作码本身占用 1 个字节,而立即数需要 2 个字节来表示。所以总共占用的存储空间为 1 + 2 = 3 个字节。请注意,这里的 0100H 表示一个十六进制的数字,相当于十进制的 256。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

枫尘冉 发表于 2024-3-12 01:49:26

FishC 发表于 2024-3-12 01:45
mov ax, 0100H 这个指令在内存中同样占用 3 个字节的存储空间。这是因为 mov 指令的操作码是 B8h,而要 ...

检测点3.1

(1)在DEBUG中,用 "D 0:0 lf" 查看内存,结果如下:

0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60

0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88

下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行完后相关寄存器中的值

mov ax,1

mov ds,ax

mov ax,ax= 2662H
上面的ax为什么等于2662H

FishC 发表于 2024-3-12 01:49:43

枫尘冉 发表于 2024-03-12 01:49
检测点3.1

(1)在DEBUG中,用 "D 0:0 lf" 查看内存 ...

根据您提供的信息,我们可以看到在执行 `mov ax, 1` 这条指令后,AX 寄存器中的值变为了 2662H。这可能是由于之前的指令和数据操作导致了 AX 寄存器的变化。

让我们来仔细分析一下:

1. 首先,检查 AX 寄存器的初始值为 0。
2. 接下来,执行 `mov ax, 1` 这条指令。这条指令的作用是将立即数 1(表示为字面值 0001H)移动到 AX 寄存器中。
3. 然而,在执行这条指令之前,还有其他指令和数据的操作。具体来说,在内存中的位置 0000:0010 处,包含了两个字节的数据 62 26。这两个字节的顺序是逆序的,因此应该解读为字面值 2662H,并且恰好和 AX 寄存器的值相同。
4. 当执行 `mov ax, 1` 指令时,这两个字节的数据被误解为立即数,被加载到了 AX 寄存器中,因此 AX 的值变为了 2662H。

所以,由于之前内存中的数据和指令操作的影响,执行 `mov ax, 1` 后 AX 寄存器的值变为了 2662H。请注意,这样的结果是不正常的,可能是由于程序中存在错误或者误操作导致的。在正常情况下,`mov ax, 1` 应该将 AX 寄存器的值设置为 0001H。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2024-3-12 10:09:17

本帖最后由 jackz007 于 2024-3-12 10:17 编辑

0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60
      表示从内存地址 0000:0000 ~ 0000:000F 一共 16 个存储单元中储存的 16 个字节的内容,具体对号入座为:
地址:内容
0000:0000 70
0000:0001 80
0000:0002 F0
0000:0003 30
0000:0004 EF
0000:0005 60
0000:0006 30
0000:0007 E2
0000:0008 00
0000:0009 80
0000:000A 80
0000:000B 12
0000:000C 66
0000:000D 20
0000:000E 22
0000:000F 60
         内存中储存的机器指令与普通数据没有任何区别,例如,上面的 16 个字节也有可能就是机器指令,内存空间什么都能储存,你存入的是什么,里面就会是什么。
页: [1]
查看完整版本: 汇编我也不知道是什么类型的问题