首页 公开文件分享 文章 随笔 聊天大厅 小工具 登录 注册 留言我们

汇编语言传递数据和地址的误区

作者: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]   ;读取四个字节