第四章:汇编源程序
要完成一个程序必须要先编写汇编源文件,然后进行汇编,链接,执行。使用debug调试时,调试的必须是连接后得到的可执行文件,并且要带扩展名。即: debug ××.exe。
第五章
用[0]表示一个内存单元时,0表示单元的偏移地址,段地址默认在ds中,单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出。[bx]同样也表示一个内存单元,它的偏移地址在bx中。
[BX]
mov ax,[bx] 即(ax)=((ds)*16+(bx)) mov [bx],ax 即((ds)*16+(bx))=(ax)
inc bx 在bx中的内容加1
loop 指令
loop指令的格式是:loop 标号,CPU执行loop指令的时候,要进行两步操作,先(cx)=(cx)-1,然后判断cx中的值,不为0则转至标号处执行程序,如果为0则向下执行。在汇编语言中,标号代表一个地址。cx中的值影响着loop指令的执行结果。通常我们用loop指令来实现循环功能,cx中存放循环次数。
使用cx和loop指令的要点:在cx中存放循环次数 ,loop指令中的标号所标识地址要放在前面,要循环执行的程序段,要写在标号和loop指令的中间。
第六章
转:(一)代码段和数据段同时存在
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
start: mov bx,0
mov ax,0
mov cx,8
s: add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
(二)在代码段中使用栈
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //定义16个字形数据,将这段空间当做栈
start: mov ax,cs
mov ss,ax
mov sp,30h
mov bx,0
mov cx,8
s: push cs:[bx]
add bx,2
loop s
mov bx,0
mov cx,8
s0: pop cs:[bx]
add bx,2
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
(三)将数据,代码,栈放入不同的段
assume cs:code,ds:data,ss:stack
data segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends
stack segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,20h
mov ax,data
mov ds,ax
mov bx,0
mov cx,8
s: push [bx]
add bx,2
loop s
s0: pop [bx]
add bx,2
loop s0
mov ax,4c00h
int 21h
code ends
end start
dw
伪指令:即“define word”,告诉编译器接下来定义字型数据
第七章
and 指令:按位逻辑与: al ← (al) ^ 001110100 B
or指令:按位逻辑或: al ← (al) ∨ 001110100B
[bx]代表一个内存地址的偏移量。假设其段地址在ds中。那么[bx]可以表示值为((ds)*16+(bx))
[bx+idata]其中idata代表常量,同样表示一个地址:((ds)*16+(bx)+200)
SI和DI与普通寄存器一样,但是SI和DI不能像AX一样分成AL和AH两个寄存器。
假设段地址为ds,[bx+si]解释为((ds)*16+(bx)+(si))
假设段地址为ds,[bx+si]解释为((ds)*16+(bx)+(di))
假设段地址为ds,[bx+si+idata]解释为((ds)*16+(bx)+(si)+idata)
假设段地址为ds,[bx+di+idata]解释为((ds)*16+(bx)+(di)+idata)
第八章
eg的集合包括:ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di。
sreg的集合包括:ds、ss、cs、es。
对于机器指令这一层来说,并不关心数据的值是多少,而关心指令执行前一刻,它将要处理的数据所在的位置,所要处理的数据可以在3个地方:CPU内部、内存、端口。
数据位置的表达:
(1)立即数(idata)
对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中),在汇编语言中称为:立即数(idata),在汇编指令中直接给出。例如:mov ax,1 | add bx,2000h | or bx,00010000b | mov al,‘a‘。
(2)寄存器
指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名。例如:mov ax,bx | mov ds,ax | push bx | mov ds:[0],bx | push ds | mov ss,ax | mov sp,ax。
(3)段地址(SA)和偏移地址(EA)
指令要处理的数据在内存中,在汇编指令中可用[X]格式给出EA,SA在某个段寄存器中。
8086CPU的指令,可以处理两种尺寸的数据,byte和word。所以在机器指令中药指明,指令进行的是字操作还是字节操作。
div是除法指令,使用div做除法的时候应该注意以下问题:除数:有8位和16位两种,在一个reg或内存单元中。被除数:默认放在AX或DX和AX中,如果除数为8位,被除数则为16位,默认在AX中存放;如果除数为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位。结果:如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数。
dup是一个操作符,在汇编语言中同db、dw、dd等一样,也是由编译器识别处理的符号。它是和db、dw、dd等数据定义伪指令配合使用的,用来进行数据的重复。
原文:https://www.cnblogs.com/lostway/p/10134425.html