汇编(1)

发布时间:2024年01月23日

MOV 指令

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

xor r/m,r/m/imm
目的操作数和源操作数位数需一致

xor bh,al
xor cx,dx
xor,ax,3
xor word [0x2002],67
xor si,[0x2002]

add指令

add r/m,r/m/imm
目的操作数和源操作数位数需一致,且不能同时为内存地址

add bh,al
add cx,dx
add ax,3
add word [0x2002],67
add si,[0x2002]

无符号数除法指令div

;如果在指令中指定的是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
文章来源:https://blog.csdn.net/xyxzlsld666/article/details/135746733
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。