相关疑难解决方法(0)

汇编:无效的有效地址

我是汇编的新手(你可以清楚地看到),我正在尝试编译以下内容:

hex_charmap db '0123456789ABCDE'
mov   al, [hex_charmap + ax]
Run Code Online (Sandbox Code Playgroud)

但是我在第2行遇到以下错误:

错误:无效的有效地址

这是什么意思,我该如何解决?

assembly

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

NASM x86 16位寻址模式

我在指向一个地址时遇到了麻烦,并在我的情况下写了一个大小为byte的变量.这给了我错误"错误:无效的有效地址":

mov byte[AX], byte 0x0
Run Code Online (Sandbox Code Playgroud)

经过一些跟踪和错误后,我测试了相同但使用EAX.编译得很好:

mov byte[EAX], byte 0x0
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

x86 assembly nasm addressing-mode x86-16

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

具有自己的操作码的寄存器EAX上的操作有什么意义?

如果你看看像操作文件cmp,test,add,sub,和and,你会发现,这涉及寄存器操作EAX,并作为第一个操作数的16位和8位的变体有明显的操作码是从这些指令"一般情况下"版本不同.

这个单独的操作码是否只是一种节省代码空间的方法,它是否比一般情况下的操作码更有效,或者它只是过去的一些遗物因兼容性原因而不值得甩掉?

x86 opcode instructions

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

引用内存位置的内容.(x86寻址模式)

我有一个内存位置,其中包含一个我想要与另一个角色进行比较的角色(并且它不在堆栈的顶部,所以我不能只是pop它).如何引用内存位置的内容以便进行比较?

基本上我如何在语法上做到这一点.

x86 assembly masm addressing-mode

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

无效的有效地址计算

请看下面的程序,错误是无效的有效地址计算,我已经提到那行,请告诉我为什么这里无效的有效地址计算是程序

[org 0x100]
jmp start


array1: dw 10,15,20,25,30,35,40,45,50,55
array2: dw 15,10,20,35,40,30,55,50,25,45

start:  mov bx,0
    mov cx,0
loop:   mov ax,[array2+bx]
        cmp ax,[array1+cx]//here is the error invalid effective address calculation 
        jne NextElementOfArray1


NextElementOfArray2:    add bx,2
                        cmp bx,20       
            je end
                        mov cx,0
            jmp loop


NextElementOfArray1:    add cx,2        
                        cmp cx,20       
            je NextElementOfArray2   
            jmp loop
end:    mov ax,0x4c00
    int 0x21
Run Code Online (Sandbox Code Playgroud)

assembly

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

最初的 16 位 x86 中是否有过 8 位内存寻址?

在实模式和 32 位保护模式下,16 位寻址用于通过 ModR/M 字节来引用存储器。此寻址仅在使用旧前缀的 i386 指令中受支持,在 x86-64 指令中完全不受支持。

然而,ModR/M 字节也被 8 位特定操作码使用,这让我怀疑原始16 位 x86 指令集中是否存在 8 位寻址。尽管 8 位地址非常有限,但完全可以使用不同的操作码以与 16 位指令相同的方式对此类指令进行编码。

例如,代替

add (bx, si), ax
Run Code Online (Sandbox Code Playgroud)

你会有

add (bl, dh), al
Run Code Online (Sandbox Code Playgroud)

很难找到任何 i386 之前的文档,所以我一无所知。这曾经被支持过吗?

x86 assembly addressing-mode x86-16

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

Intel x86手册中是否确实存在像直接/间接寻址模式这样的术语?

为了提供一些背景知识,我想研究x86指令是如何手动编码/解码的。我遇到了ModR/Mand SIB字节,似乎了解x86寻址模式对于理解指令编码方案至关重要。

因此,我在Google搜索了x86寻址模式。搜索返回的大多数博客/视频都是8086处理器的寻址模式。通过其中的一些,不同的寻址模式是寄存器,直接,间接,索引,基于等。但是,在引用这些寻址方式时,博客使用的名称不一致。多个不同的源使用多种不同的寻址模式。此处的英特尔手册中甚至没有提到这些不同的术语。例如,我似乎无法在Intel手册中找到任何称为“直接”或“间接”的寻址模式。另外,Mod在比特ModRM字节是一个2比特字段,这使我不知道是否超过4种的寻址方式是可能的。

我的问题是,诸如直接寻址模式之类的术语是间接寻址模式的旧术语,这些术语不再在英特尔手册中使用,而是由公众使用。如果存在技术上确实存在的术语,则可以在手册中找到它们的引用。

x86 assembly addressing-mode

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

NASM:实模式下无效的有效地址

我试图在实模式下绘制到屏幕,所以我试图使用分段访问 0xB8000

我的汇编代码是这样的

[BITS 16]
org 0x7c00

begin:
  mov ah, 0x01 ; disable cursor
  mov ch, 0x3f
  int 0x10

  mov ch, 0x0000
  mov cs, 0xb800
  mov ah, 0x0000
  mov [cs:ah], ch ; invalid effective address

end:
  jmp end

times 510 - ($-$$) db 0
dw 0xaa55
Run Code Online (Sandbox Code Playgroud)

我将如何正确使用分段来解决 0xB8000?

assembly real-mode nasm osdev x86-16

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

16位汇编:无法解析某些寄存器

我正在尝试以下Intel 16位指令:

mov si, word [reg]

在哪里reg注册.如果regbx,它编译好,但是当它是ax,cx或者dx.我正在使用NASM作为我的汇编程序.我确定这是由于指令集中的一些限制.有人可以解释其背后的限制和理由吗?

assembly x86-16

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

标签 统计

assembly ×8

x86 ×5

addressing-mode ×4

x86-16 ×4

nasm ×2

instructions ×1

masm ×1

opcode ×1

osdev ×1

real-mode ×1