首页
公开文件分享
文章
随笔
聊天大厅
小工具
登录
注册
留言我们
汇编语言传递数据和地址的误区
作者:hhcgchpspk
最近学习汇编语言的时候,发现了一个盲点:mov 寄存器,标号,它是传送数据还是地址?
我一直都以为16位为传数据,32位为传地址,这里拿16位和32位举例
16位:
assume cs:code ,ds:data
data segment
db 'hpspkhpspk'
db '..........'
data ends
code segment
start: mov ax,data
.....
code ends
end start
32位:
section .bss
buffer resb 64
section .data
prompt db 'your name:'
;...
section .text
global _start
_start: ;...
mov ecx,prompt
;...
两个mov的寄存器结果:
ax:076A ecx:0x804a000
这里其实已经出答案了,但当时我先学的16位汇编,没想过这个问题,直到最近学32位汇编才发现(太菜了,别喷我)
两个都是传地址,只是16位的data太迷惑人了,搞得我以为mov ax,data是传数据
data和prompt都是标号,本质是内存地址的别名
再写个注释:
mov ax,data ;ax=data段地址(16位)
mov ecx,prompt ;ecx=prompt的线性地址(32位)
如果是mov 寄存器,[标号]才是传数据比如
mov al,[data] ;读取一个字节或 mov ecx,[prompt] ;读取四个字节