MASM例程从32位地址读取dword

时间:2012-06-01 19:42:49

标签: assembly masm masm32

因此,我们的一个项目遇到了一些需要编写的汇编代码。我们有一个旧的,旧的(用Borland 1992编译)内存测试器C程序,偶尔需要放入程序集来读取某些内存区域的值。我需要编写一个MASM汇编例程,它接受一个32位的内存地址并返回该位置的dword。我唯一的装配经验是大约4年前的MIPS,所以我很生疏。到目前为止,我有这个:

; Do a direct read of a memory address
public _mmap_io
_mmap_io PROC FAR

push  bp          ; 'C' entry    

mov   bp,sp       ; set pointer to parm list
push  es
xor   ax, ax      ; clear ax        
mov   es, ax      ; clear es?
add   bp, 6       ; bump to parms

xor eax,eax       ; clear eax
mov eax, [bp]     ; move the value pointed to by bp into eax
mov esi, eax      ; source index
mov eax,es:[esi]                           

pop   es    
pop   bp          ; 'C' exit    
ret

_mmap_io ENDP

问题是,当我读到价值观时,我得到的东西差不多,但并不完全是我正在寻找的东西。当我运行类似的东西时......

DWORD output = mmap_io(0xEFF87110);
printf("output: %p\n");

output = mmap_io(0xE0000000);
printf("output: %p\n");

在0xEFF87110中的值为0x00000000且0xE0000000中有0x80863C00的内存空间中,我最终得到:

output: 0110:0000
output: 9463:8086

我相信我正在混淆我的16位和32位寄存器,但任何修复这些寄存器的尝试都会导致进一步的问题。有没有人有更好,更清晰的代码直接从32位内存地址读取,或者可以帮助我解决我的问题?

1 个答案:

答案 0 :(得分:-1)

这可以在很好的旧C中完成。不需要组装。假设“dword”是32位:

#include <stdint.h>

uint32_t peek32(uintptr_t address)
{
   volatile uint32_t * ptr = (volatile uint32_t *)address;
   return *ptr;
}

void poke32(uintptr_t address, uint32_t value)
{
   volatile uint32_t * ptr = (volatile uint32_t *)address;
   *ptr = value;
}

类似的版本可以用于16位和8位值。