看见满屏花花绿绿我仿佛看见了我太奶
第7章
and & or SI & DI & bp
and指令进行按位与运算,可通过该指令将操作对象对应位设为0。or指令进行按位或运算,可通过改指令将操作对象对应位设为1。这里的按位均按二进制进行。
si,di是8086CPU中和bx功能相近的寄存器,不能作为两个8位寄存器来使用。bp也可以作为偏移地址,但是其默认的段地址在ss中。
mov ax,[bx+si+idata]中的括号内容也可以有以下表现形式:[bx+200+si],[200+bx+si],200[bx][si],[bx].200[si],[bx][si]200。即可以用一个变量;一个常量;一个变量+一个常量;两个变量;两个变量+一个常量
实验6
编程使得给出的字符串的前四个字母变成大写
1 | assume cs:codesg,ss:stacksg,ds:datasg |
以下为运行中途的结果展示
第8章
数据
数据可以在三个位置:CPU内部,内存,端口。而表达数据可以有三种概念:立即数(即包含在机器指令中的数据,执行前在CPU的指令缓冲器中),寄存器,段地址和偏移地址(在内存中)。
数据的尺寸可以有两种指明方式,1.通过寄存器指明,类似于mov ax,1为字操作mov al,1为字节操作;2.可以用操作符x ptr完成,类似于mov word ptr[bx],1为一个字单元,mov byte ptr [bx],1为一个字节单元。
div指令
div是一个除法指令,除数保存在寄存器或者内存单元中,16位的被除数放ax中而32位ax放低16位dx放高16位。结果,8位则al放商,ah放余数;16位则ax放商,dx放余数。
格式类div 内存单元/寄存器 或者 div byte ptr ds:[0]
db dw dd & dup
在之前定义栈段的时候用过dw,得到的空间为16个字节,而dw也意为为每个数据申请一字的内存,db是一字节,dd是两个字的内存。
dup是一个操作符,与db,dw,dd配合使用,用于数据的重复,也就是定义多少个重复的数。格式为db 重复次数 dup (重复的字节型数据) 格式以此类推。例如需要申请一个容量为200和字节的栈段,db 200 dup(0)。
实验7
将已有数据按照一定格式存入空间中,并增加一个位置用于储存计算结果。
1 | assume cs:code,ss:stack |
下图为效果展示(关于我到了第十章却反复修改了三次这个代码这件事
第9章
offset
修改执行指令的顺寻的指令为转移指令,在8086CPU中转移指令分为:无条件转移指令,条件转移指令,循环指令,过程,中断。转移行为分为了只修改IP的段内转移,修改CS和IP的段间转移。
操作符offset可以获得标号的偏移地址,比如,mov ax,offset start,ax中会保存start标识位置的相对偏移地址。
jmp
jmp short 标号,段内短转移,对IP的修改范围为-128-127,该指令的机器码中不包含转移的目的地而是偏移地址。
jmp far ptr 标号,段间转移。机器码中包含目的地址,高地址为段地址,低地址为偏移地址。
jmp 寄存器(16位)IP修改为寄存器的内容。
jmp word ptr 内存单元地址(段内转移),单元中存放的是目的偏移地址。
jmp dword ptr 内存单元地址(段间转移),高地址是转移的目的段地址,低地址是转移的目的偏移地址。
jcxz & loop
jcxz是条件转移地址,所有的有条件转移指令都是段转移,对应机器码中包含转移的位移,而不是目的地址,格式:jcxz 标号。转移条件为cx内容==0。
loop作为循环指令的基础就是loop能根据标号转移,同时cx==0也是loop的条件。
ps:如果源程序中出现了转移范围越界的问题,在编译时编译器会报错。
实验8
分析一个奇怪的程序,运行来观察其实现过程,乍一看代码是真的匪夷所思。
1 | assume cs:codesg |
以下是过程截图
实验9
在画面中间显示要求的花里胡哨的字符
1 | assume cs:codesg,ds:data |
贴一个效果图
分享一个我不小心把循环的标识写错了的输出效果图,跟吃了菌子一样