汇编语言程序设计 第5~8章概念梳理

Posted cymwn-com

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言程序设计 第5~8章概念梳理相关的知识,希望对你有一定的参考价值。

汇编语言程序设计第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个字节



















































































以上是关于汇编语言程序设计 第5~8章概念梳理的主要内容,如果未能解决你的问题,请参考以下文章

汇编语言程序设计 第2章概念梳理

Atitit 编程语言原理与概论attilax总结 三大书籍总结

第8章 数据库后台编程技术

Java语言程序设计(第3版)沈泽刚主编第6,7,8章课后习题答案

第8章 面向对象编程

spark考试