标签:数据 伪指令 依赖 段地址 star sum 运算 设置 特定
汇编语言程序设计第5~8章小结:
第5章:
直接寻址和间接寻址问题:
直接寻址:mov dl,[0]; dl=((ds)*16+0)
间接寻址:mov bx,0 mov dl,[bx];dl=((ds)*16+bx)
assume cs:code
code segment
mov ax,1
mov cx,8
s: add ax,ax
loop s
mov ax,4c00h
int 21h
code ends
end
循环操作 段前缀标记所指的部分代码,直到cx寄存器当中的值变为零
t命令、p命令、g命令小结:
t命令:遇到loop会进入循环内部继续单步执行
遇到int会进入中断程序内部继续单步执行
p命令:单步执行;遇到loop或者int会当作整体执行,不进入内部单步执行
g命令:执行到指定地址,或遇到程序结束或int,则终止执行.
计算内存单元00202H和00204H中存放的字数据之和
mov ax,0020h
mov ds,ax
mov dx,0
add dx,[2]
add dx,[4]
注意字节与字数据的大小关系兼容问题:
在求字节数据相加之和时,不能使用字大小寄存器去取值。
在完整的汇编源程序当中,应当显式写出段前缀,防止反汇编错误。
第6章:
在代码段中使用数据:(示例代码)
assume cs:code
code segment
dw 0123h,0456h,0789h, 0abch,
0defh,0fedh, 0cbah, 0987h
mov ax, 0 ;ax用来存放求和结果
mov cx, 8
mov bx, 0 ;bx用来存放偏移地址
s: add ax, cs: [bx] ;使用寄存器代表偏移量
add bx, 2
loop s
mov ax,4c00h
int 21h
code ends
end
使用u进行反汇编命令时,由于数据和代码在一个段中,地址cs:0000~cs:000f中存放的是
8个字数据(占16个字节)
反汇编时,如果从cs:0000开始,会把它们当做指令机器码反汇编.
如想让程序从这里执行,有两种方法:
1、debug时,通过r命令修改ip的值或在t/g命令中指定执行的起始地址。
2、在源程序中指定
代码和数据在同一个段内程序框架:
assume cs:code
code segment
×××(数据)
…
start: ×××(代码)
…
mov ax,4c00h
int 21h
code ends
end start
使用伪指令segment和ends定义逻辑段后,究竟是用作代码段、数据段还是栈,由程序员指定。
使用assume仅仅表示将某个逻辑段和某个寄存器关联起来;真正当作特定的段使用,需要在代码
段中设置相应的段寄存器值,如ds,ss。
段名代表的是段地址,是常数。不能使用mov直接送入段寄存器
第7章:
按位逻辑与运算:
mov al,01100011B
and al,00111011B
结果:00100011B
按位逻辑或运算:
mov al,01100011B
or al,00111011B
结果:01111011B
debug中,默认位十六进制
在完整汇编源程序中,默认十进制,支持二/十六进制。
a命令不支持诸如‘a‘这样的写法,只能使用字符ASCII码的十六进制表示
e命令支持诸如‘a‘这样的写法,例如:-e 0200:0 ‘a‘ ‘b‘ ‘c‘
字母的大小写转换问题:
大写--->小写 mov dl,‘A‘ add dl,32
小写--->大写 mov dl,‘a‘ sub dl,32
使用逻辑或运算进行修改:
大写--->小写 mov dl,‘A‘ or dl,00100000B;
小写--->大写 mov dl,‘a‘ or dl,11011111B
将字符‘1‘--->数值1
mov dl,‘1‘ sub dl,48
将数值1--->字符‘1‘
mov dl,‘1‘ add dl,48
一般来说,在需要暂存数据的时候,我们都应该使用栈
例如双层循环,在每次内存循环开始的时候,将外层循环的cx中的数值保存起来,在执行
外层循环的loop指令前,再恢复外层循环的cx的值,可以用寄存器dx来临时保存1cx中的数值
第8章:
在8086CPU中,可用于表示内存偏移地址的寄存器只有BX,SI,DI和BP.
使用BX,SI,DI表示偏移地址时,默认段地址在DS中
使用BP表示偏移地址时,默认段地址在SS中
汇编运算符:
把内存单元ds:[0]作为字节单元还是字单元,依赖于另一个操作数是8位还是16位
存在疑问的操作:
mov ax,1000H mov ds,ax mov [0],5
mov ax,1000H mov ds,ax mov byte ptr [0],5
mov ax,1000H mov ds,ax mov word ptr [0],5
div和mul两个无符号乘除运算指令
mul乘法指令:
8*8 被乘数--->al 积:16位 在ax
16*16 被乘数--->ax 积:32位 规定在dx:ax
div除法指令:
mov ax, 1001 mov bl, 100 div bl
被除数--->ax, 除数 任意可用于保存的寄存器1
商在 al中,余数在ah中
汇编伪指令:db,dw,dd,dup
db 1,2,3 每个数据分配一个字节
dw 1,2,3 每个数据分配两个字节
dd 1,2,3 每个数据分配4个字节
标签:数据 伪指令 依赖 段地址 star sum 运算 设置 特定
原文地址:https://www.cnblogs.com/cymwn-com/p/10214614.html