相关疑难解决方法(0)

括号在x86 asm中的含义是什么?

给出以下代码:

L1     db    "word", 0

       mov   al, [L1]
       mov   eax, L1
Run Code Online (Sandbox Code Playgroud)

括号([L1])代表什么?

x86 assembly

56
推荐指数
4
解决办法
4万
查看次数

汇编:在两个存储器地址之间移动

我正在尝试学习汇编(所以忍受我),我在这一行得到了一个编译错误:

mov byte [t_last], [t_cur]
Run Code Online (Sandbox Code Playgroud)

错误是

error: invalid combination of opcode and operands
Run Code Online (Sandbox Code Playgroud)

我怀疑这个错误的原因只是因为一个mov指令不可能在两个内存地址之间移动,但是半小时的谷歌搜索并且我无法确认这一点 - 是这样的吗?

另外,假设我是对的,这意味着我需要使用寄存器作为复制内存的中间点:

mov cl, [t_cur]
mov [t_last], cl
Run Code Online (Sandbox Code Playgroud)

什么是推荐使用的寄存器(或者我应该使用堆栈)?

x86 assembly instructions mov

19
推荐指数
4
解决办法
3万
查看次数

什么时候应该在x86中使用大小指令?

在x86中何时使用大小指令似乎有点模棱两可。此x86组装指南中的内容如下:

通常,可以从引用该数据项的汇编代码指令中推断出该数据项在给定存储地址处的预期大小。例如,在所有上述指令中,可以从寄存器操作数的大小推断出存储区域的大小。当我们加载32位寄存器时,汇编程序可以推断出我们所指的内存区域为4字节宽。当我们将一个字节的寄存器的值存储到内存中时,汇编程序可以推断出我们希望地址引用内存中的单个字节。

他们给出的例子很简单,例如将立即数移到寄存器中。
但是,如何处理更复杂的情况,例如:

mov    QWORD PTR [rip+0x21b520], 0x1
Run Code Online (Sandbox Code Playgroud)

在这种情况下,QWORD PTR size指令不是多余的,因为根据上述指南,可以假定由于RIP为8字节,所以我们要将8字节移入目标寄存器吗?x86体系结构上的size指令的最终规则是什么?谢谢,我在任何地方都找不到答案。

更新:正如罗斯指出,以上示例中的目的地不是寄存器。这是一个更相关的示例:

mov    esi, DWORD PTR [rax*4+0x419260] 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,不能假设由于ESI为4个字节而要移动4个字节,从而使DWORD PTR指令变得多余了吗?

x86 assembly x86-64

5
推荐指数
2
解决办法
1467
查看次数

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

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

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

x86 assembly masm addressing-mode

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

方括号在x86汇编中的含义是什么?

我对装配很新,并且有一些非常基本的问题.

这四个命令有什么区别?

mov ebx, eax
mov [ebx], eax
mov ebx, [eax]
mov [ebx], [eax]
Run Code Online (Sandbox Code Playgroud)

他们说括号的意思是"得到地址的价值".但那么,第一线真正做到了什么呢?它不会将eax的价值转移到ebx吗?如果是这样,那么括号的重点是什么?

memory x86 assembly intel-syntax

4
推荐指数
2
解决办法
3232
查看次数

"mov eax, [num]" 和 "mov eax, num" 之间的区别

我是初学者,正在编写汇编程序以使用以下代码打印 1 到 9 的数字:

section .text    
   global _start                    
_start:                     
   mov ecx,10    
   mov eax, '1'     
l1:    
   mov [num], eax    
   mov eax, 4    
   mov ebx, 1    
   push ecx     
   mov ecx, num            
   mov edx, 1            
   int 0x80     
   mov eax, [num]    
   sub eax, '0'    
   inc eax    
   add eax, '0'    
   pop ecx    
   loop l1      
   mov eax,1             ;system call number (sys_exit)    
   int 0x80              ;call kernel    
section .bss    
num resb 1
Run Code Online (Sandbox Code Playgroud)

这里我们有以下三个声明:

  1. mov [num], eax
  2. mov ecx , 编号
  3. mov eax, [num]

我想知道为什么我们应该使用mov ecx,num而不是 …

x86 assembly 32-bit nasm

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

重新定位被截断以适合 r_386_8 对 .bss'

当我输入 ld -m elf_i386 -o loop loop.asm 时,我得到标题中所述的错误,知道是什么原因造成的吗?对不起,如果代码看起来很糟糕,对汇编来说相当新。

cr equ 13 
lf equ 10 

section .bss
numA resb 1

section .text

global _start:

mov [numA],byte 0
call loop1
jmp endend
loop1:
xor cx,cx
mov al, $numA
cmp cx, 0x0A
jle else 
inc al
jmp end
else:
dec al
jmp end
end:
mov [$numA], al
inc cx
cmp cx,20
jle loop1

endend:
mov dl,$numA
mov ah,2
int 21h
Run Code Online (Sandbox Code Playgroud)

assembly nasm ld

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

重定位在NASM x86_64中截断为适合错误

我正在使用配备Intel Core 2 CPU和2GB RAM的计算机.SO是Ubuntu 9.04.当我尝试编译此代码时:

;programma per la simulazione di un terminale su PC, ottenuto utilizzando l'8250

;in condizione di loopback , cioè Tx=Rx


section .code64

section .data


TXDATA  EQU 03F8H ;TRASMETTITORE

RXDATA  EQU 03F8H ;RICEVITORE

BAUDLSB  EQU 03F8H ;DIVISORE DI BAUD RATE IN LSB

BAUDMSB  EQU 03F9H ;DIVISORE DI BAUD RATE IN MSB

INTENABLE EQU 03F9H ;REGISTRO DI ABILITAZIONE DELL'INTERRUZIONE

INTIDENTIF EQU 03FAH ;REGISTRO DI IDENTIFICAZIONE DELL'INTERRUZIONE

LINECTRL EQU 03FBH ;REGISTRO DI CONTROLLO DELLA LINEA

MODEMCTRL EQU 03FCH …
Run Code Online (Sandbox Code Playgroud)

linker nasm relocation truncated

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