「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」
-
字符串修改和替换
;需求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 -
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] 不允许这样写 -
除法指令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 ;将余数存放至内存中
-
乘法指令
mov ax,100 mov bx,1000 mul bx ;相乘 mov ds:[0],ax ;将积低16位存放至内存中 mov ds:[2],dx ;将积高16位存放至内存中