【发布时间】:2019-12-05 07:41:02
【问题描述】:
我对 64 位模式下的 32 位寻址大小而不是 64 位寻址大小有疑问
func:
movzx eax, al ; instead of movzx rax, al
mov eax, DWORD [4 * eax + .data] ; instead of mov rax, QWORD [8 * rax + .data]
ret
.data:
DD .DATA1 ; instead of DQ
DD .DATA2 ; instead of DQ
DD .DATA3 ; instead of DQ
DD .DATA4 ; instead of DQ
.DATA1 DB 'HEY1', 0x00
.DATA2 DB 'HEY2', 0x00
.DATA3 DB 'HEY3', 0x00
.DATA4 DB 'HEY4', 0x00
在 64 位 中是否安全?因为我认为在 64 位和这样的寻址中,没有问题! (我这样做是因为 .data)
我认为 .data 如果程序大小(可执行文件)小于约 100 Mb,则每个项目地址都适合 32 位寄存器 strong> 永远是!
【问题讨论】:
-
您正在从 .data 中读取数据,它只是一个指向内存的指针。之后的事情是你自己的选择。此外,您在阅读时必须知道是否需要将数据读取为 32 位或 64 位值(甚至是字节,因为内容似乎是 ascii 字符串)。
-
您可以安全地作弊,通过使用从 64 位基地址偏移的 32 位偏移量,例如“
myTable: dd .DATA1- myTable, DATA2-myTable, ...”和“movzx ecx, al,mov ecx,dword [myTable + ecx*4],mov rax,myTable,@987654326 @"。
标签: assembly x86-64 addressing-mode