因此,我们的一个项目遇到了一些需要编写的汇编代码。我们有一个旧的,旧的(用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位内存地址读取,或者可以帮助我解决我的问题?
答案 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位值。