15 补充
神人sgf的迷惑出题
15.1 求整数平方根
数学原理是\(n^2 = \sum_{i=0}^{n-1} 2i+1\),那么用\(\sum 2i+1\)和\(n^2\)比大小,正好相等时的\(i=n-1\),代码如下
SQRT PROC NEAR
push ax
push bx
push cx
mov ax, si ;取n2
sub cx, cx ;cx=0,同时让FLAGS置零
again:
mov bx, cx ;bx=i
add bx, bx
inc bx ;bx=2i+1
sub ax, bx
jc over ;存在借位,说明ax<bx,就结束
inc cx
jmp again ;ax>bx就继续
over:
mov si, cx
pop cx
pop bx
pop ax
ret
SQRT ENDP
15.2 冒泡排序
算法就是一次次冒泡,一共n个数,就有n-1+n-2+...+1次交换,也就是两层循环,外层n-1次,内层n-i次(从1开始),代码如下
start:
mov ax, data ;存放要排的数据
mov ds, ax
mov cx, n-1 ;n个数排序
LP1:
mov di, cx ;di就是j,j=n-i
mov bx, 0 ;寻址用
LP2:
mov al, table[bx]
cmp al, table[bx+1] ;两个数比较
jge next ;这里的排序方法是从大到小,所以是ge
xchg al, table[bx+1] ;不是就交换两个数,这个是交换的代码
mov table[bx], al
next:
inc bx ;下一对数据
dec di ;内层循环-1
jnz LP2
loop LP1 ;外层循环-1
15.3 小tips
in, out指令只能用ax, al存放读/写的数据,16bit用ax,8bit用alUSART: Universal Synchronous/Asynchronous Receiver/Transmitter 通用同步/异步数据收发器
在8251A异步初始化中,需要多次向端口写0,详见复习ppt第60页
异步串行通讯的数据规格:起始位1b;数据位5-8b,D0在先;奇偶校验位1b;停止位1/1.5/2b
8253的方式1,方式3,方式5比较重要
DOS系统的启动
冷启动是从完全断电状态开始,电源上电后产生复位信号,BIOS执行POST(Power On Self Test)进行全面硬件检测和初始化,并加载引导程序启动操作系统内核。热启动是在计算机已开启状态下,通过特定按键组合或系统选项触发,发送复位信号使CPU等硬件复位,但不重新上电,BIOS仅对部分硬件简单检测,操作系统关闭程序后重新加载内核并尝试恢复用户环境,速度比冷启动快。
冷启动:电源重新打开,整个系统初始化
清理内存
检查内存
CS = FFFFHIP = 0000H,3/4一起将指令指向了BIOSBIOS检查端口,识别和初始化设备
BIOS 建立两个数据区:从
0000H开始的中断向量区;BIOS数据区BIOS 加载系统文件
热启动:跳过自检,不会清空内存
- 复位启动reset:复位,见8.2节RESET引脚
程序段前缀(PSP,Program Segment Prefix)
- 加载子程序时在程序占用的内存前256个Byte中,含有程序返回,文件名等信息
- PSP的地址默认作为
DS, ES的值,故不加指定,则CS = DS +10H(256D = 100H)
TEST指令,改变SF/ZF/PF,OF = CF = 0TEST reg1/opr1, reg2/opr2,按位进行与操作,只改变FLAGS不改变操作数- 当两个都是0时,结果是0
INT 21H- 2号功能
- 字符显示功能,功能号存在
MOV ah, 02H中;输入MOV dl, char,是字符的ASCII码
- 字符显示功能,功能号存在
- 9号功能
- 字符串显示功能,
MOV ah, 09H,DS:DX指向一个以$结尾的字符串,显示这个字符串
- 字符串显示功能,
- 0A号功能
- 键盘输入存放到缓冲区(包括回车,回车是输入结束标志),
MOV ah, 0AH,DS:DX指向缓冲区 - 缓冲区第一个字节是用户预先定义的缓冲区大小(1-255),第二个字节是DOS系统写的读取的字符数
- 键盘输入存放到缓冲区(包括回车,回车是输入结束标志),
- 2号功能
显示数字的那个实验题,《微机原理实验》的10.3节
传统总线结构,见复习ppt第67页
PUSHA指令,依次压入AX, CX, DX, BX, SP, BP, SI, DI,然后SP -= 16;POPA返回所有压缩的BCD码:用4bit binary表示1bit decimal;非压缩:用8bit binary,其中高四位都是0
- 数字的ASCII码是非压缩的BCD码:0 - 0011 0000 = 30H = 48D;9 - 0011 1001
中断和DMA比较
- 中断:在CPU执行完一条指令后响应;通过中断服务程序(保护和恢复寄存器);可由软/硬件引起
- DMA:在CPU执行完一个总线周期后响应;传送1B只需要1~2个总线周期;可有软/硬件引起
无论是
jmp dword ptr,call far ptr,在保存或设置CS:IP时,都是IP的地址更低,在机器码中也是IP编译得更低XLAT指令将ds:[bx+al]地址的内容存放到al寄存器中,一般而言bx是某个表的偏移地址,al原始值则是需要的值在表中的偏移,在使用直接定址表时比较方便(我在努力帮神人sgf说话了,学这指令干嘛?)REPZ/E, REPNZ/E和REP类似,但是多一个检查ZF的状态,前者在相等时继续,后者在不等时继续,搭配CMPSB/W(对比es:[di]和ds:[si]的字节/字)和SCASB/W(查找al/ax,从内存地址es:[di]开始)