汇编入门学习笔记(二)

6.多个段的汇编程序
代码段用于存放代码,数据段用于存放数据,栈段存放栈数据。当然也可以将数据,栈数据都放在代码段,这样代码太臃肿,不易理解。


assume cs:codesg, ds:datasg, ss:stacksg
;数据段
datasg segment
dw …;在数据段定义字
db …;在数据段定义字节
datasg ends
;栈段
stacksg segment
dw …;在数据段定义字
db …;在数据段定义字节
stacksg ends
;代码段
codesg segment
start:mov ax, 2000h
…
mov ax, 4c00h
int 21h
codesg ends
end start



7.更加灵活定位内存地址方法
7.1 and和or
and (位与运算)1 and 1 = 1, 1 and 0 = 0, 0 and 1 = 0, 0 and 0 = 0
or (位或运算) 1 or 1 = 1, 1 or 0 = 1, 0 or 1 = 1, 0 or 0 = 0
7.2字母大小转换
如A的ASCII:41H=01000001B, a的ASCII:61H=01100001B
即: 41H(A)+20H=61H(a)
大写转小写(改变大写字母2进制的第5位为1,位从0开始计算)
41H(01000001B) or 00100000B = 61H(01100001)
小写转大写(改变小写字母2进制的第5位为0,位从0开始计算)
61H(01100001B) and 11011111B

;将数据段中ibm,dec,doc,vax 首字母大写。
assume cs:codesg, ds:datasg
datasg segment
db 'ibm ';16byte
db 'dec '
db 'doc '
db 'vax '
datasg ends

codesg segment
start: mov ax, datasg
mov ds, ax
mov bx, 0

mov cx, 4
s0: mov si, 0
mov cx, 3
s : mov al, [bx+si]
and al, 11011111b
mov [bx+si], al

inc si

loop s

add bx, 16
loop s0

mov ax, 4c00h
int 21
codesg ends

end start


上述程序中loop s0的cx被loop s 的cx覆盖掉了,死循环。可以利用debug查看。改进程序如下。
assume cs:codesg, ds:datasg
datasg segment
db 'ibm ';16byte
db 'dec '
db 'doc '
db 'vax '
datasg ends

codesg segment
start: mov ax, datasg
mov ds, ax
mov bx, 0

mov cx, 4
s0: mov dx, cx ;cx临时存在dx中
mov si, 0
mov cx, 3
s : mov al, [bx+si]
and al, 11011111b
mov [bx+si], al

inc si

loop s

add bx, 16
mov cx, dx ;从dx中还原cx的
loop s0

mov ax, 4c00h
int 21
codesg ends

end start
 



7.3 多种定位内存方法
 [idata] idata指常量,在汇编中要写成ds:[idata]如:ds:[0]
 [bx] bx寄存器指默认数据段ds下偏移地址, ds:[bx]如:mov bx,1000h mov ax, [bx]
 [bx+idata]bx可变寻址结合固定地址idata,类似C语言一位数组
 [bx+si+idata] bx和si可变寻址结合固定地址idata,类似C语言二位数组
 [bx+di+idata] bx和di可变寻址结合固定地址idata,类似C语言二位数组

8数据处理两个基本问题(数据地址,数据长度)
8.1 bx, si, di, bp
 bx, si, di, bp可以在[…]中进行内存单元寻址
 在[…]中,这4个寄存器可以单独出现,或只能以4中组合出现
bx+si, bx+di, bp+si, bp+di
 在[…]中,单独使用[bp],没有显示给定段地址,段地址默认在ss上。
Mov ax,[bp] 含义 (ax)=((ss)*16+(bp))
Mov ax,[bp+si] (ax)=((ss)*16+(bp)+(si))
8.2指令要处理的数据有多长
1.通过寄存器指明处理数据长度.如mov ax, 1000H
2.在没有寄存器场合,通过操作符XPtr指明内存单元长度,X在汇编指令中可以是word或者byte.如mov word Ptr [bx+1], 1000H, mov byte Ptr [bx+3], ‘V’

8.3 div指令
除数:8位或者16位
被除数:(默认)放在AX或者DX和AX中
结果:运算 8位 16位
商 al ax
余数 ah dx
Div byte ptr ds:[0]
含义 (al) = (ax)/((ds)*16+0)的商
(ah) = (ax)/((ds)*16+0)的余数

Div word ptr es:[0]
含义 (ax) = [(dx)*10000H+(ax)]/((es)*16+0)的商
(dx) = [(dx)*10000H+(ax)]/((es)*16+0)的余数


利用div计算1001/100
mov ax, 1001
mov bl, 100
div bl
执行后商(al) = 0AH, 余数(ah) = 1

利用div计算186A1H/64H
mov dx, 1
mov ax, 86A1h
mov bx, 64h
div bx
执行后商(ax)=03e8h,余数(dx)= 1

8.4伪指令dd
dd是用来定义dword(double world双子)

datasg segment
db 1;01H
dw 1; 0001H
dd 1;00000001H
datasg ends


8.5伪指令dup
它是和db,dw,dd配合使用的,用于数据重复。
db 3 dup(0) = db 0,0,0
db 3 dup(0,1,3) = db 0, 1, 3, 0, 1, 3, 0 ,1 ,3
db 3 dup(‘Abc’,’BB’) = db ’AbcBBAbcBBAbcBB’

9.转移指令原理
9.1 offset
由编译器处理的指令,取得标号的偏移的地址。

assume cs:codesg
codesg segment
start: mov ax, offset start ;相当于mov ax,0
s: mov ax, offset s;相当于mov ax,3
codesg ends

9.2无条件转移指令jmp指令
 jmp shot 标号;功能(IP)=(IP)+8位位移
 jmp near ptr 标号;功能(IP) = (IP)+16位位移
 jmp far ptr 标号:同时修改cs:ip
 jmp 16位寄存器 功能:IP=(16位寄存器)
 jmp word ptr 内存单元地址(段内转移)
mov ax,0123h
mov ds:[0], ax
jmp word ptr ds:[0]

执行后IP=0123h
 jmp dword ptr 内存单元地址(从内存单元地址存放两个字,高位字是cs,低位字是ip)
9.3有条件转移指令jcxz指令
jcxz 标号(如果(cx)=0,则移到标号处执行)
9.4loop指令
loop 标号((cx)=(cx)-1,如果(cx)!=0移到标号处执行)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值