Assembly 使用汇编语言查找变量的内存位置
你好,我是汇编语言新手。我正在尝试使用DOSBOX和MASM编译器获取变量m的内存位置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
.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手册,以避免将来出现这种混淆。