x86汇编语言之字符串修改和Loop循环等指令

792 阅读3分钟

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

  1. 字符串修改和替换

    ;需求1 : 将内存中he修改为wo
    
    data segment
    	str dw 'he'
    	newstr dw 'wo'
    data ends
    
    
    start:
    	mov ax,data
    	mov ds,ax   
    
    	mov ax,ds:str
    	mov ds:newstr,ax 
    
    end start
    
    
    
    ;需求2 : 将内存中hello 修改为wowowo
    
    data segment
    	str dw 'hello '
    	newstr dw 'wowowo'
    data ends
    
    
    start:
    	mov ax,data
    	mov ds,ax   
    
    	mov ax,ds:str
    	mov ds:newstr,ax 
    	
    	mov ax,ds:str+2
    	mov ds:newstr+2,ax
    
    	mov ax,ds:str+4
    	mov ds:newstr+4,ax
    
    end start
    
    

    分段写法:

    
    data segment
    	str dw 'he'
    	
    data ends
    
    newData segment
         newstr dw 'wo'
    newData ends
    
    code segment
    start:
    	mov ax,data
    	mov ds,ax   
    	mov ax,newData
    	mov es,ax
    	
    	mov ax,ds:str
    	mov es:newstr,ax 
    	
    code ends
    
    end start 
    
  2. Loop循环指令

    类似于高级语言中的while循环, 系统默认从cx寄存器中读取数据作为循环的条件,当cx中的值cx-1大于零时循环执行一次代码

    示例:

    ;需求 : 将内存中wowowo修改为hello 
    
    data segment
    	str dw 'hello '
    	newstr dw 'wowowo'
    data ends
    
    
    start:
    	mov ax,data
    	mov ds,ax   
    	
    	mov bx,0 
    	mov cx,3
    replace:	
    	mov ax,ds:[bx]
    	mov ds:[bx+6],ax 
    	add bx,2
    	loop replace
    
    end start
    
    
    ;需求 : 将内存中wowowo修改为hello 
    
    data segment
    	dw 'aaa'
    	str dw 'hello '
    	newstr dw 'wowowo'
    data ends
    
    
    start:
    	mov ax,data
    	mov ds,ax   
    	
    	mov bx,offset str 
    	mov cx,3
    replace:	
    	mov ax,ds:[bx]
    	mov ds:[bx+6],ax 
    	add bx,2
    	loop replace
    
    end start
    

    加减运算指令add和sub

    add ax,2 ;ax=ax+2
    sub ax,2 ;ax=ax-2
    
    
    sub/add 通用寄存器,数值  ;add/sub ax,2
    sub/add 通用寄存器,通用寄存器 ;add/sub ax,bx
    sub/add 内存地址,通用寄存器 ;add/sub ds:[0],bx
    sub/add 通用寄存器,内存地址 ;add/sub ax,ds:[0]
    
    
    ;错误写法
    sub/add 内存地址,内存地址 ;;add/sub ds:[0],ds:[3]  不允许这样写
    
  3. 除法指令div

    格式:

    div 寄存器  ;div bx   该寄存器表示除数 
    

    公式是被除数÷除数=商……余数

被除数需要预先存放在ax寄存器中,相除后商存放在ax寄存器中,余数存放在dx寄存器中

mov ax,2000 ;定义被除数
mov bx,300   ;定义除数
div bx      ; 进行除法运算

mov ds:[0],ax ;将商存放至内存中
mov ds:[2],dx ;将余数存放至内存中

因为ax和dx需要存放被除数和余数, 因此除数一般放在bx,cx,或者内存中

由于16位寄存器最多只能存放16位数据,假如被除数数值超过十六位,那么被除数低16位存放在ax寄存器中,高十六位存放在dx寄存器中

mov dx,20   ;定义被除数高16位
mov ax,2000 ;定义被除数低16位  就是1407D0H
mov bx,300   ;定义除数
div bx      ; 进行除法运算

mov ds:[0],ax ;将商存放至内存中
mov ds:[2],dx ;将余数存放至内存中
  1. 乘法指令

    mov ax,100
    mov bx,1000
    mul bx    ;相乘
    
    mov ds:[0],ax ;将积低16位存放至内存中
    mov ds:[2],dx ;将积高16位存放至内存中