Assembly 使用汇编语言查找变量的内存位置

Assembly 使用汇编语言查找变量的内存位置,assembly,machine-language,Assembly,Machine Language,你好,我是汇编语言新手。我正在尝试使用DOSBOX和MASM编译器获取变量m的内存位置 .model small .stack 100H .data VARA BYTE 10 ;address is DS:xxxx VARB BYTE 0BH ;address is DS:xxxx+1 VARC WORD ? VARD SBYTE ? VARE DWORD ? ARR BYTE 20 DUP(?) VARF SWORD 010B AR

你好,我是汇编语言新手。我正在尝试使用DOSBOX和MASM编译器获取变量m的内存位置

     .model small
   .stack 100H
 .data
   VARA BYTE 10   ;address is DS:xxxx
 VARB BYTE 0BH  ;address is DS:xxxx+1
 VARC WORD ?
   VARD SBYTE ?
   VARE DWORD ? 
   ARR BYTE 20 DUP(?)
  VARF SWORD 010B
  ARRB WORD 10 DUP(?)
  VARZ BYTE 0
 .CODE
  MAIN PROC
    mov ax,@data
mov ds,ax
mov ax,offset VARA
mov ah,09
int 21h

mov ax,offset VARB
mov ah,09
int 21h


    mov ax,offset VARC
mov ah,09
int 21h

    mov ax,offset VARD
mov ah,09
int 21h


    mov ax,offset VARE
mov ah,09
int 21h


mov ax,offset ARR
mov ah,09
int 21h


    mov ax,offset VARF
mov ah,09
int 21h

    mov ax,offset ARRB
mov ah,09
int 21h

mov ax,offset VARZ
mov ah,09
int 21h


mov ah,4ch
int 21h
main endp
end main
如何找到所有这些变量的内存地址?你可以在图像中看到错误


使用
偏移量
修饰符,例如:

mov ax, OFFSET VARA
VARA
的地址加载到
ax
寄存器中。您还可以使用
LEA
指令实现相同的功能:

lea ax, VARA

thanx我应该对每个变量使用它,还是只对VarA使用它,然后递增以获得其他地址?请告诉我我能做什么?@abd两者都可以工作。如果您知道变量的相对地址,当然,只需递增即可获得其他地址。就我个人而言,我只是单独加载每个地址。lea ax,ARR mov ah,09 int 21h打印ARR id所在的内存位置stored@abd打印地址需要首先将其转换为字符串,然后发出DOS请求(您所指的INT 21h/AH=09h)使用包含字符串地址的DX寄存器。如何执行此操作的详细信息比此处注释中解释的更复杂。此外,如果在汇编过程中遇到错误,您需要在问题中发布您试图汇编的确切代码和错误消息的确切文本,而不是在注释中。您可以尝试使用MASM的
/L
命令行选项编译它以生成列表文件,我认为地址也将可见(以数据段中的偏移量的形式,直到二进制加载到内存中并从加载程序动态链接到它的目标位置,才知道绝对真实的物理地址).关于错误:将
VARA BYTE 10
(大小说明符)更改为
VARA DB 10
(“定义字节”指令),等等(
DW
用于
WORD
swarm
DD
用于
DWORD
)@ped7g在将其更正为db后,屏幕上没有错误,但没有输出。这是正确的,您以错误的方式调用了ah,9。重新阅读davmac答案中的其他注释,直到您理解它们。顺便说一句,我阅读了MSDN MASM文档一小会儿,在现代MASM中定义字节的方法是正确的,但正如您所看到的rk在DOS下使用旧的DOS版本的MASM,它只知道
DB
是“定义字节”。您应该尝试使用旧的DOS MASM手册,以避免将来出现这种混淆。