15 补充

学习笔记
作者: MingXiao

神人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用al

  • USART: 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仅对部分硬件简单检测,操作系统关闭程序后重新加载内核并尝试恢复用户环境,速度比冷启动快。

  • 冷启动:电源重新打开,整个系统初始化

    1. 清理内存

    2. 检查内存

    3. CS = FFFFH

    4. IP = 0000H,3/4一起将指令指向了BIOS

    5. BIOS检查端口,识别和初始化设备

    6. BIOS 建立两个数据区:从0000H开始的中断向量区;BIOS数据区

    7. BIOS 加载系统文件

  • 热启动:跳过自检,不会清空内存

    • 复位启动reset:复位,见8.2节RESET引脚
  • 程序段前缀(PSP,Program Segment Prefix)

    • 加载子程序时在程序占用的内存前256个Byte中,含有程序返回,文件名等信息
    • PSP的地址默认作为DS, ES的值,故不加指定,则CS = DS +10H256D = 100H
  • TEST指令,改变SF/ZF/PFOF = CF = 0

    • TEST reg1/opr1, reg2/opr2,按位进行与操作,只改变FLAGS不改变操作数
    • 当两个都是0时,结果是0
  • INT 21H

    • 2号功能
      • 字符显示功能,功能号存在MOV ah, 02H中;输入MOV dl, char,是字符的ASCII码
    • 9号功能
      • 字符串显示功能,MOV ah, 09HDS:DX指向一个以$结尾的字符串,显示这个字符串
    • 0A号功能
      • 键盘输入存放到缓冲区(包括回车,回车是输入结束标志),MOV ah, 0AHDS:DX指向缓冲区
      • 缓冲区第一个字节是用户预先定义的缓冲区大小(1-255),第二个字节是DOS系统写的读取的字符数
  • 显示数字的那个实验题,《微机原理实验》的10.3节

  • 传统总线结构,见复习ppt第67页

  • PUSHA指令,依次压入AX, CX, DX, BX, SP, BP, SI, DI,然后SP -= 16POPA返回所有

  • 压缩的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 ptrcall far ptr,在保存或设置CS:IP时,都是IP的地址更低,在机器码中也是IP编译得更低

  • XLAT指令将ds:[bx+al]地址的内容存放到al寄存器中,一般而言bx是某个表的偏移地址,al原始值则是需要的值在表中的偏移,在使用直接定址表时比较方便(我在努力帮神人sgf说话了,学这指令干嘛?)

  • REPZ/E, REPNZ/EREP类似,但是多一个检查ZF的状态,前者在相等时继续,后者在不等时继续,搭配CMPSB/W(对比es:[di]ds:[si]的字节/字)和SCASB/W(查找al/ax,从内存地址es:[di]开始)



Comments