mov 目的操作数,源操作数
目的操作数:寄存器/内存地址
源操作数:寄存器/内存地址/立即数
//mov指令可以在寄存器之间传送数据,但是寄存器的宽度必须相同
mov ah,bh //正确
mov ax,dx //正确
mov ax,bl //错误格式
//mov 指令可以将内存里的数据传送到寄存器
mov al,[0xf000]//把内存里偏移地址为f000的数据传送到寄存器al,
//在传送时,段地址在段寄存器中
//因为接收的寄存器大小为一个字节,所以传送一个字节
mov bx,[0x08]
//mov指令可以将立即数传送到寄存器
mov al,0x07
mov bx,0x08
//mov指令可以将寄存器的内容传送到指定的内存地址处
//传送时数据的宽度取决于寄存器的宽度
mov [0x0c],dx
mov [0x2000],ah
//当立即数只知道大小,不知道长度,目标位置只知道地址,不知道长度时
mov byte [0x02],0xe9//传送一个字节
mov word [0x06],0x3c//传送两个字节
//目的操作数不允许是立即数,且目的操作数和源操作数不允许同时为内存单元
mov 0x07,al//非法指令
mov [0x01],[0x02]//非法指令
mov ip,0xf000//非法,ip寄存器不能出现在任何指令中,只能间接修改
mov ds,ax
mov es,[0x3002]//如果目的操作数是段寄存器,
//源操作数只能是通用寄存器或内存地址
不同形式的mov指令,其操作码是不一样的
标号代表汇编地址
xor r/m,r/m/imm
目的操作数和源操作数位数需一致
xor bh,al
xor cx,dx
xor,ax,3
xor word [0x2002],67
xor si,[0x2002]
add r/m,r/m/imm
目的操作数和源操作数位数需一致,且不能同时为内存地址
add bh,al
add cx,dx
add ax,3
add word [0x2002],67
add si,[0x2002]
;如果在指令中指定的是8位寄存器或8位操作数的内存地址,
意味着被除数在寄存器ax里
;相除后,商在寄存器al里,余数在寄存器ah里
div bh
div byte [0x2002]
;如果在指令中指定的是16位寄存器或16位操作数的内存地址,
意味着被除数是32位的,低16位在ax里,高16位在dx里
;相除后,商在寄存器ax里,余数在寄存器dx里
div bx
div word [0x2002]
;如果在指令中指定的是32位寄存器或32位操作数的内存地址,
意味着被除数是64位的,低32位在eax里,高32位在edx里
;相除后,商在寄存器eax里,余数在寄存器edx里
div ebx
div dword [0x2002]
实战:
start:
;在屏幕上显示数字65535
mov ax,65535
xor dx,dx
mov bx,10
div bx ;ax=商(6553),dx=余数(5)
add dl,0x30;将数字转换为对应的数字字符
mov cx,0
mov dx,cx
mov [0x7c00+buffer],dl
xor dx,dx
div bx
add dl,0x30
mov [0x7c00+buffer+1],dl
xor dx,dx
div bx
add dl,0x30
mov [0x7c00+buffer+2],dl
xor dx,dx
div bx
add dl,0x30
mov [0x7c00+buffer+3],dl
xor dx,dx
div bx
add dl,0x30
mov [0x7c00+buffer+4],dl
mov cx,0xb800
mov es,cx
mov al,[0x7c00+buffer+4]
mov [es:0x00],al
mov byte [es:0x01],0x2f
mov al,[0x7c00+buffer+3]
mov [es:0x02],al
mov byte [es:0x03],0x2f
mov al,[0x7c00+buffer+2]
mov [es:0x04],al
mov byte [es:0x05],0x2f
mov al,[0x7c00+buffer+1]
mov [es:0x06],al
mov byte [es:0x07],0x2f
mov al,[0x7c00+buffer]
mov [es:0x08],al
mov byte [es:0x09],0x2f
again:
jmp again
buffer db 0,0,0,0,0
current:
times 510-(current-start) db 0
db 0x55,0xaa