注册 登录
编程论坛 汇编论坛

还是汇编中的小问题 但是对于初学者来说是很困惑的

万万切克闹 发布于 2015-06-11 00:24, 4324 次点击
data segment
     f1 db 1
     f2 db 2
data  ends
code segment
     assume cs:code,ds:data
start: mov ax,data
       mov ds,ax
       add ax,f1
       add ax,f2
       mov dx,ax
       mov ah,2
       int 21h
       mov ah,4ch
       int 21h
code ends
     end start
怎么通过f1和f2让 1和2相加 ?总感觉 有时f1 f2表示地址 有时表示 1和2这两个值?求解惑
4 回复
#2
取名字2015-06-11 16:42
在你的程序中,f1,f2是你定义的标号,编译时被编译成地址,但因为这个标号在data段中定义,后面不带冒号(这种标号也只能在data段中定义),在表示地址的同时,也表示后面所定义的内存单元的长度为1字节,所以这种标号代表的其实就是ds:[f1],ds:[f2],当然前面的段寄存器由你设定,也就是说,我们像下面这样编写:
mov    al,f1
mov    bl,f2
实际上就是:
mov    al,ds:[f1]
mov    bl,ds:[f2]
所以执行之后,al中的值就是1,bl中的值就是2。
所以f1,f2作为标号表示地址,但因为这2个标号同时表示了它们所定义的内存单元的长度,所以可以通过它们直接引用其中的值。
我们要让f1和f2中的1和2相加,就可以如下面这样编写:
mov    al,f1
add    al,f2
不能直接写成:
add    f1,f2
因为不允许在2个内存单元之间直接操作。
#3
取名字2015-06-11 16:50
我们要得到f1,f2的地址,可以这样编写:
mov    bx,offset f1
mov    bp,offset f2
#4
zklhp2015-06-12 09:18
这两天好热闹啊
1