Assembly 从向寄存器添加常量获取地址
好的。我的任务是这样的:Assembly 从向寄存器添加常量获取地址,assembly,x86-64,Assembly,X86 64,好的。我的任务是这样的:%edx寄存器的值为0xe000,%ecx寄存器的值为0x200。写下根据以下公式计算的地址: 0x10(%edx) (%edx,%ecx) (%edx,%ecx,4) 0x8(,%ecx,2) 我知道在第一个示例中它应该是0x10+0xe000,在第二个地址中它应该是0xe000+0x200等等。但是当我想用汇编程序测试自己时,它不起作用(抛出分段错误(堆芯转储): 这是例如nr 1。我做错了什么?(Manjaro 64位)您没有打印地址,您正在尝试从内存打印值,但由于
%edx
寄存器的值为0xe000
,%ecx
寄存器的值为0x200
。写下根据以下公式计算的地址:
0x10(%edx)
(%edx,%ecx)
(%edx,%ecx,4)
0x8(,%ecx,2)
0x10+0xe000
,在第二个地址中它应该是0xe000+0x200
等等。但是当我想用汇编程序测试自己时,它不起作用(抛出分段错误(堆芯转储)
:
这是例如nr 1。我做错了什么?(Manjaro 64位)您没有打印地址,您正在尝试从内存打印值,但由于没有出现故障的有效指针。请使用
leal 0x10(%edx),%esi
相反。天哪,leax
代表加载有效地址x,我应该自己找到它。谢谢!您不是在打印地址,您是在尝试从内存打印值,但由于没有出现故障的有效指针。请使用leal 0x10(%edx),%esi
相反。天哪,leax
代表加载有效地址x,我应该自己找到的。谢谢!
.section .rodata
.LC0:
.string "%d"
.text
.globl main
.type main, @function
main:
pushq %rbp
movq %rsp, %rbp
movl $0xe000, -4(%rbp)
movl $0x200, -8(%rbp)
movl -4(%rbp), %edx
movl -8(%rbp), %ecx
movl $.LC0, %edi
movl 0x10(%edx), %esi
movl $0, %eax
call printf
movl $0, %eax
leave
ret