给出以下代码:
L1 db "word", 0
mov al, [L1]
mov eax, L1
Run Code Online (Sandbox Code Playgroud)
括号([L1])代表什么?
我正在尝试学习汇编(所以忍受我),我在这一行得到了一个编译错误:
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中何时使用大小指令似乎有点模棱两可。此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指令变得多余了吗?
我有一个内存位置,其中包含一个我想要与另一个角色进行比较的角色(并且它不在堆栈的顶部,所以我不能只是pop它).如何引用内存位置的内容以便进行比较?
基本上我如何在语法上做到这一点.
我对装配很新,并且有一些非常基本的问题.
这四个命令有什么区别?
mov ebx, eax
mov [ebx], eax
mov ebx, [eax]
mov [ebx], [eax]
Run Code Online (Sandbox Code Playgroud)
他们说括号的意思是"得到地址的价值".但那么,第一线真正做到了什么呢?它不会将eax的价值转移到ebx吗?如果是这样,那么括号的重点是什么?
我是初学者,正在编写汇编程序以使用以下代码打印 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)
这里我们有以下三个声明:
我想知道为什么我们应该使用mov ecx,num而不是 …
当我输入 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) 我正在使用配备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) assembly ×7
x86 ×6
nasm ×3
32-bit ×1
instructions ×1
intel-syntax ×1
ld ×1
linker ×1
masm ×1
memory ×1
mov ×1
relocation ×1
truncated ×1
x86-64 ×1