自制操作系统(五、重写引导部分和C语言的使用)

为了实现其他更多功能,我决定重新写引导部分的内容

boot.asm

; boot.asm
%include "config.inc"setuplen equ 4
bootseg equ 0x07c0
initseg equ def_initseg
setupseg equ def_setupseg
sysseg equ def_syssegsetupsector equ 2
syssector equ setupsector+setuplen
syscylind equ 7ROOT_DEV equ 0
SWAP_DEV equ 0jmp startstart:mov ax, 0mov ss, axmov sp, bootsegmov ax, bootsegmov ds, axmov si, welcomecall showmsgmov word [root_dev], 0x021cmov ax, initsegmov es, axmov cx, 256sub si, sisub di, direpmovswjmp initseg:gogo:mov ax, csmov ds, axmov si, msg1call showmsgmov ax, csmov ss, axmov sp, 0xfef4mov si, msg2call showmsgmov ax, setupsegmov es, axmov byte [sector+11], setupsectorcall loadsetupmov si, msg3call showmsgmov ax, syssegmov es, axmov byte [sector+11], syssectorcall loadsystemjmp setupseg:0showmsg:call newlinecall printstrcall newlineretloadsetup:call read1sectormov ax, esadd ax, 0x0020mov es, axinc byte [sector+11]cmp byte [sector+11], setuplen+1+1jne loadsetupretloadsystem:call read1sectormov ax, esadd ax, 0x0020mov es, axinc byte [sector+11]cmp byte [sector+11], 18+1jne loadsystemmov byte [sector+11], 1inc byte [header+11]cmp byte [header+11], 1+1jne loadsystemmov byte [header+11], 0inc byte [cylind+11]cmp byte [cylind+11], syscylind+1jne loadsystemretnumtoascii:mov ax, 0mov al, clmov bl, 10div bladd ax, 3030hretreadinfo:mov si, cylindcall printstrmov si, headercall printstrmov si, sectorcall printstrretread1sector:mov cl, [sector+11]call numtoasciimov [sector+7], almov [sector+8], ahmov cl, [header+11]call numtoasciimov [header+7], almov [header+8], ahmov cl, [cylind+11]call numtoasciimov [cylind+7], almov [cylind+8], ahmov ch, [cylind+11]mov dh, [header+11]mov cl, [sector+11]call readinfomov di, 0
retry:mov ah, 02hmov al, 1mov bx, 0mov dl, 00hint 13hjnc readokinc dimov ah, 0x00mov dl, 0x00int 0x13cmp di, 5jne retrymov si, fyerrorcall printstrcall newlinejmp exitread
readok:mov si, floppyokcall printstrcall newline
exitread:retprintstr:mov al, [si]cmp al, '$'je disovermov ah, 0ehint 10hinc sijmp printstr
disover:retnewline:mov ah, 0ehmov al, 0dhint 10hmov al, 0ahint 10hretwelcome db '(i) Plain boot!', '$'
msg1 db '1.boot to 0x9000', '$'
msg2 db '2.setup to 0x9020', '$'
msg3 db '3.system to 0x1000', '$'
cylind db 'cylind:?? $', 0
header db 'header:?? $', 0
sector db 'sector:?? $', 1
floppyok db '-floppy read ok', '$'
fyerror db '-floppy read error', '$'times 512-2*3-($-$$) db 0swap_dev:dw SWAP_DEV
root_dev:dw ROOT_DEVboot_flag: db 0x55, 0xaa

setup.asm

; setup.asm
%include "config.inc"initseg equ def_initseg
sysseg equ def_sysseg
setupseg equ def_setupsegjmp startstart:mov ax, setupsegmov ds, axmov si, welcomecall showmsgmov ax, initsegmov es, axmov si, msg1call showmsgmov ah, 0x88int 0x15mov [es:2], axmov si, msg2call showmsgmov ah, 0x12mov bl, 0x10int 0x10mov [es:8], axmov [es:10], bxmov [es:12], cxmov ax, 0x5019mov [es:14], axmov ah, 0x03xor bh, bhint 0x10mov [es:0], dxmov si, msg3call showmsgmov ah, 0x0fint 0x10mov [es:4], bxmov [es:6], axmov si, msg4call showmsgpush dsmov ax, 0x0000mov ds, axlds si, [4*0x41]mov ax, initsegmov es, axmov di, 0x0080mov cx, 0x10repmovsbpop dsmov si, msg5call showmsgpush dsmov ax, 0x0000mov ds, axlds si, [4*0x46]mov ax, initsegmov es, axmov di, 0x0090mov cx, 0x10repmovsbpop dsmov si, msg6call showmsgmov ax, 0x01500mov dl, 0x81int 0x13jc no_disk1cmp ah, 3je is_disk1
no_disk1:mov ax, initsegmov es, axmov di, 0x0090mov cx, 0x10mov ax, 0x00repstosb
is_disk1:mov si, msg7call showmsgmov si, msg8call showmsgmov cx, 14
line:call newlineloop lineclicall mov_systemmov ax, setupsegmov ds, axlidt [idt_48]lgdt [gdt_48]call empty_8042mov al, 0xd1out 0x64, alcall empty_8042mov al, 0xdfout 0x60, alcall empty_8042call set_8259amov ax, 0x0001lmsw axjmp dword 1*8:0mov_system:mov ax, 0x0000cld
do_move:mov es, axadd ax, 0x1000cmp ax, 0x9000jz end_movemov ds, axsub di, disub si, simov cx, 0x8000repmovswjmp do_move
end_move:retset_8259a:mov al, 0x11out 0x20, aldw 0x00eb, 0x00ebout 0xa0, aldw 0x00eb, 0x00ebmov al, 0x20out 0x21, aldw 0x00eb, 0x00ebmov al, 0x28out 0xa1, aldw 0x00eb, 0x00ebmov al, 0x04out 0x21, aldw 0x00eb, 0x00ebmov al, 0x02out 0xa1, aldw 0x00eb, 0x00ebmov al, 0x01out 0x21, aldw 0x00eb, 0x00ebout 0xa1, aldw 0x00eb, 0x00ebmov al, 0xffout 0x21, aldw 0x00eb, 0x00ebout 0xa1, alretempty_8042:dw 0x00eb, 0x00ebin al, 0x64test al, 2jnz empty_8042retidt_48:dw 0x800dw 0, 0
gdt_48:dw 0x800dw 512+gdt, 0x9gdt:dw 0, 0, 0, 0dw 0x07ff, 0x0000, 0x9a00, 0x00c0dw 0x07ff, 0x0000, 0x9200, 0x00c0showmsg:call newlinecall printstrretprintstr:mov al, [si]cmp al, '$'je disovermov ah, 0x0eint 0x10inc sijmp printstr
disover:retnewline:mov ah, 0x0emov al, 0x0dint 0x10mov al, 0x0aint 0x10retwelcome db '(ii) welcome Plain setup!', 0x0d, 0x0a, '$'
msg1 db '1.get memory size', '$'
msg2 db '2.check for ega/vga and some config parameters', '$'
msg3 db '3.get video-card data', '$'
msg4 db '4.get hd0 data', '$'
msg5 db '5.get hd1 data', '$'
msg6 db '6.check that there is a hd1', '$'
msg7 db '7.move system from 0x10000 to 0x00000', '$'
msg8 db '8.now ready to protect mode!', '$'times 512*4-($-$$) db 0

head.asm

%include "config.inc"setupseg equ def_setupseg
sysseg equ def_sysseg_pg_dir equ 0x0000
pg0 equ 0x1000
pg1 equ 0x2000
pg2 equ 0x3000
pg3 equ 0x4000_tmp_floppy_area equ 0x5000
len_floppy_area equ 0x400[bits 32]jmp starttimes _tmp_floppy_area+len_floppy_area-($-$$) db 0start:mov eax, 2*8mov ds, eaxmov es, eaxmov fs, eaxmov gs, eaxmov ss, eaxmov esi, sysmsgmov cl, 0x0cmov edi, 0xb8000+13*160call printnewmov esi, promsgmov cl, 0x0cmov edi, 0xb8000+15*160call printnewmov esi, headmsgmov cl, 0x0cmov edi, 0xb8000+16*160call printnewmov esp, 0x1e25ccall setup_idtcall setup_gdtjmp 1*8:newgdtnopnop
newgdt:mov esi, gdtmsgmov cl, 0x09mov edi, 0xb8000+17*160call printnewstiint 00hclicall a20openmov esi, a20msgmov cl, 0x09mov edi, 0xb8000+19*160call printnewcall setup_pagingmov dword [_pg_dir+4*768], pg0+7sgdt [gdt_descr]add dword [gdt_descr + 2], kernel_virtual_addressadd esp, kernel_virtual_addressxor eax, eaxmov cr3, eaxmov eax, cr0or eax, 0x80000000mov cr0, eaxlgdt [gdt_descr]jmp 8:ready_cnopnopready_c:call kernel_initmov esp, kernel_virtual_address+0x51000mov esi, mainmsgmov cl, 0x09mov edi, 0xb8000+22*160call printnewjmp kernel_entry_pointkernel_init:xor eax, eaxxor ebx, ebxxor ecx, ecxxor edx, edxmov dx, [kernel_bin_base_addr + 42]mov ebx, [kernel_bin_base_addr + 28]add ebx, kernel_bin_base_addrmov cx, [kernel_bin_base_addr + 44].each_segment:cmp byte [ebx + 0], pt_nullje .ptnullpush dword [ebx + 16]mov eax, [ebx + 4]add eax, kernel_bin_base_addrpush eaxpush dword [ebx + 8]call mem_copyadd esp, 12
.ptnull:add ebx, edxloop .each_segmentretmem_copy:push ebpmov ebp, esppush esipush edipush ecxmov edi, [ebp+8]mov esi, [ebp+12]mov ecx, [ebp+16]cmp ecx, 0je nocopy
cgoon:mov eax, [esi]add esi, 4mov [edi], eaxadd edi, 4loop cgoon
nocopy:pop ecxpop edipop esipop ebpretsetup_paging:mov dword [_pg_dir], pg0+7mov dword [_pg_dir+4], pg1+7mov dword [_pg_dir+8], pg2+7mov dword [_pg_dir+12], pg3+7mov edi, pg3+4092mov eax, 0xfff007std
goon:stosdsub eax, 0x1000jge goonmov esi, pagemsgmov cl, 0x09mov edi, 0xb8000+20*160call printnewmov esi, asmmsgmov cl, 0x09mov edi, 0xb8000+21*160call printnewreta20open:xor eax, eaxinc eaxmov [0x000000], eaxcmp eax, [0x100000]je a20openretprintnew:mov bl, [ds:esi]cmp bl, '$'je printovermov byte [ds:edi], blinc edimov byte [ds:edi], clinc esiinc edijmp printnew
printover:retsetup_idt:lea edx, [ignore_int]mov eax, 0x00080000mov ax, dxmov dx, 0x8e00lea edi, [_idt]mov ecx, 256
rp_sidt:mov [edi], eaxmov [edi+4], edxadd edi, 8loop rp_sidtlidt [idt_descr]retignore_int:clipushadpush dspush espush fspush gspush ssmov eax, 2*8mov ds, eaxmov es, eaxmov fs, eaxmov gs, eaxmov ss, eaxmov esi, intmsgmov cl, 0x09mov edi, 0xb8000+18*160call printnewpop sspop gspop fspop espop dspopadiretalign 2
dw 0idt_descr:dw 256*8-1dd _idtretsetup_gdt:lgdt [gdt_descr]retalign 2
dw 0gdt_descr:dw 256*8-1dd _gdtsysmsg db '(iii) welcome Plain system!', '$'
promsg db '1.now already in protect mode', '$'
headmsg db '2.run head.asm in system program', '$'
gdtmsg db '3.reset gdt success:new cs\eip normal', '$'
intmsg db '4.reset idt success:unknown interrupt', '$'
a20msg db '5.check a20 address line stdate:open', '$'
pagemsg db '6.memory page store:page tables is set up', '$'
asmmsg db '7.pure asm program:bootsect->setup->head(system) is finished', '$'
mainmsg db '8.now come to c program entry:main()', '$'_idt: times 256 dq 0_gdt:dq 0x0000000000000000dq 0x00cf9a000000ffffdq 0x00cf92000000ffffdq 0x0000000000000000times 252 dq 0kernel_bin_base_addr:

 config.inc

;%define   debug             ;不注释调试,注释用于生产
%ifdef    debug
isdebug   equ   1
%else
isdebug   equ   0
%endifdef_initseg	equ	0x9000    ;MBR程序挪动后的目标地址
def_sysseg	equ	0x1000    ;SYSEM模块放置地址
def_setupseg	equ	0x9020    ;SETUP模块放置地址kernel_virtual_address  equ  0xc0000000 ;内核程序虚拟地址3GB-4GB
kernel_entry_point equ  0x00051500  ;内核程序main.c入口地址pt_null equ 0   ;ELF格式标准

 接下来可以进入内核了

测试一下

kernel.asm

[BITS 32]						GLOBAL _asmfunc
GLOBAL _print_char
EXTERN _printstr[SECTION .text];C语言调用汇编语言测试
;void asmfunc(char *s,char start_line_x,char start_col_y,char corlor)
_asmfunc:push            ebpmov             ebp,esp;由于push ebp导致栈顶又多挪动了4位push           dword [EBP+16+4]   ;corlorpush           dword [EBP+12+4]   ;start_col_ypush           dword [EBP+08+4]   ;start_line_xpush           dword [EBP+04+4]   ;*s;汇编语言调用C语言测试
;void printstr(char *s,char start_line_x,char start_col_y,char corlor)CALL           _printstrpop            eax   ;全是为了保持函数调用时push的栈平衡pop            eaxpop            eaxpop            eaxpop            ebpret_print_char:mov esi, msgmov cl, 0x09mov edi, 0xb8000+24*160call printnewretprintnew:mov bl, [ds:esi]cmp bl, '$'je printovermov byte [ds:edi], blinc edimov byte [ds:edi], clinc esiinc edijmp printnew
printover:retmsg db 'hello!', '$'

main.c

 

void printchar(char c,char line_x,char col_y,char corlor);
void printstr(char *s,char start_line_x,char start_col_y,char corlor);
extern void asmfunc(char *s,char start_line_x,char start_col_y,char corlor);
extern void print_char(void);void _main(void)
{char *str="kernel";printstr(str,23,20,0x0c);//print_char();//char *str2="C->A->C";  /*C调用汇编,汇编又调用C演示*/  //asmfunc(str2,24,20,0x0c);while(1);}/*打印一个字符,参数:字符,行号,列号,字符颜色*/
void printchar(char c,char line_x,char col_y,char corlor)
{
*(char *)(0xb800+line_x*160+2*col_y) =c;  
*(char *)(0xb800+line_x*160+2*col_y+1) =corlor;  
}/*打印一个字符串,参数:字符串首地址,开始行号,开始列号,字符颜色*/
void printstr(char *s,char start_line_x,char start_col_y,char corlor)
{do{printchar(*s,start_line_x,start_col_y,corlor);start_col_y++;}while (*(s++)!='\0');
}

makefile

#
#                       _oo0oo_
#                      o8888888o
#                      88' . '88
#                      (| -_- |)
#                      0\  =  /0
#                    ___/`---'\___
#                  .' \|      |// '.
#                 / \|||   :  |||// "
#                / _||||| -:- |||||- "
#               |   | \\  -  /// |   |
#               | \_|  ''\---/''  |_/ |
#               \  .-\__  '-'  ___/-. /
#             ___'. .'  /--.--\  `. .'___
#          .''' '<  `.___\_<|>_/___.' >' '''.
#          | | :  `- \`.;`\ _ /`;.`/ - ` : | |
#          \  \ `_.   \_ __\ /__ _/   .-` /  /
#      =====`-.____`.___ \_____/___.-`___.-'=====
#                        `=---='
#
#      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#                   佛祖保佑   永无bug
#                   阿弥陀佛   功德无量
#      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Copyright (c) lhhasm & resfz
#  Plain0.0.1 Makefile
all:make out1.batecho OK!!!out:nasm -I include/ bootloader/boot.asm -o bin/boot.binnasm -I include/ bootloader/setup.asm -o bin/setup.binnasm -I include/ bootloader/head.asm -o bin/head.binnasm -f elf kernel/kernel.asm -o bin/kernel.obj -l kernel/kernel.lstgcc -c -m32 -Os -o bin/main.o kernel/main.ci686-elf-ld -Ttext 0x0051500 -e main -Map kernel.map -o bin/kernel.bin bin/main.o bin/kernel.obj

 make编译

qemu似乎无法运行

VMware启动:

然而

 

如果去掉打印部分运行就正常

后面我们再修复

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/83933.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

口罩佩戴检测算法AI智能分析网关V4工厂/工业等多场景守护公共卫生安全

一、引言​ 在公共卫生安全日益受到重视的当下&#xff0c;口罩佩戴成为预防病毒传播、保障人员健康的重要措施。为了高效、精准地实现对人员口罩佩戴情况的监测&#xff0c;AI智能分析网关V4口罩检测方案应运而生。该方案依托先进的人工智能技术与强大的硬件性能&#xff0c;…

【评测】用Flux的图片文本修改的PS效果

【评测】Flux的图片文本修改的PS效果 1. 百度图库找一张有英文的图片 2. 打开https://playground.bfl.ai/image/edit上传图片 3. 输入提示词 “change brarfant to goodbeer” 图片的文字被修改了

【汇编逆向系列】三、函数调用包含单个参数之float类型-xmm0寄存器,sub,rep,stos,movss,mulss,addss指令

一、汇编代码 single_float_param:0000000000000060: F3 0F 11 44 24 08 movss dword ptr [rsp8],xmm00000000000000066: 57 push rdi0000000000000067: 48 83 EC 10 sub rsp,10h000000000000006B: 48 8B FC mov …

深入了解UDP套接字:构建高效网络通信

个人主页&#xff1a;chian-ocean 文章专栏-NET 深入了解UDP套接字&#xff1a;构建高效网络通信 个人主页&#xff1a;chian-ocean文章专栏-NET 前言&#xff1a;UDPUDP 特点&#xff1a;UDP的应用 套接字地址IP地址&#xff08;Internet Protocol Address&#xff09;IP地址…

C++课设:实现简易文件加密工具(凯撒密码、异或加密、Base64编码)

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏介绍&#xff1a;《编程项目实战》 目录 一、初识文件加密&#xff1a;为什么需要…

Qt/C++学习系列之Excel使用记录

Qt/C学习系列之Excel使用记录 前言The process was ended forcefully.解决方式断点查语句问题 总结 前言 在项目中解析条目达50多条&#xff0c;并且都需要将对应的结果进行显示。为了将结果显示的更加清晰&#xff0c;考虑采用QTableWidget进行表格设置&#xff0c;而在使用过…

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…

并发编程实战(生产者消费者模型)

在并发编程中使用生产者和消费者模式能够解决绝大多数的并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序整体处理数据的速度。 生产者和消费者模式&#xff1a; 在线程的世界中生产者就是产生数据的线程&#xff0c;而消费者则是消费数据的线程。在多线程开…

力扣hot100---152.乘积最大子数组

给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的非空连续子数组&#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该子数组所对应的乘积。 测试用例的答案是一个 32-位 整数。 示例 1: 输入: nums [2,3,-2,4] 输出:6解释: 子数组 [2,3] 有最…

什么是DevOps智能平台的核心功能?

在数字化转型的浪潮中&#xff0c;DevOps智能平台已成为企业提升研发效能、加速产品迭代的核心工具。然而&#xff0c;许多人对“DevOps智能平台”的理解仍停留在“自动化工具链”的表层概念。今天&#xff0c;我们从一个真实场景切入&#xff1a;假设你是某互联网公司的技术负…

柯尼卡美能达Konica Minolta bizhub 205i打印机信息

基本参数 产品类型&#xff1a;激光数码复合机颜色类型&#xff1a;黑白涵盖功能&#xff1a;复印、打印、扫描最大原稿尺寸&#xff1a;A3内存容量&#xff1a;256MB供纸容量&#xff1a;标配 350 页&#xff0c;最大 1350 页介质重量&#xff1a;标准纸盒 64-157g/㎡&#xf…

虚拟机与宿主机应用通信配置指南

1. 选择虚拟机网络模式 桥接模式 (Bridged) 客户机获得独立局域网IP&#xff0c;与宿主机同网段。 客户机可直接访问宿主机IP&#xff08;如 192.168.1.x&#xff09;。 Host-Only 模式 仅宿主机与客户机之间通信&#xff0c;宿主机通常有一个虚拟网卡&#xff08;如 192.16…

网络库libhv介绍

libhv是一个类似于libevent、libev、libuv的跨平台网络库&#xff0c;提供了更易用的接口和更丰富的协议&#xff0c;用来开发TCP/UDP/SSL/HTTP/WebSocket/MQTT 客户端/服务端。源码地址&#xff1a;https://github.com/ithewei/libhv&#xff0c;最新发布版本为v1.3.3&#xf…

施耐德特价型号伺服电机VIA0703D31A1022、常见故障

⚙️ ‌一、启动类故障‌ ‌电机无法启动‌ ‌可能原因‌&#xff1a;电源未接通、制动器未释放、接线错误或控制器故障。‌解决措施‌&#xff1a; 检查电源线路及断路器状态&#xff1b;验证制动器是否打开&#xff08;带制动器型号&#xff09;&#xff1b;核对电机与控制器…

【Redis从入门到精通实战文章汇总】

&#x1f4da;博客主页&#xff1a;代码探秘者 ✨专栏&#xff1a;文章正在持续更新ing… ✅C语言/C&#xff1a;C&#xff08;详细版&#xff09; 数据结构&#xff09; 十大排序算法 ✅Java基础&#xff1a;JavaSE基础 面向对象大合集 JavaSE进阶 Java版数据结构JDK新特性…

MCP 技术完全指南:微软开源项目助力 AI 开发标准化学习

引言 在人工智能快速发展的今天&#xff0c;如何让 AI 模型与客户端应用程序之间建立标准化的交互机制&#xff0c;已成为开发者们亟待解决的关键问题。微软近期开源的 mcp-for-beginners 项目&#xff0c;为我们提供了一个系统性学习 Model Context Protocol (MCP) 的绝佳机会…

SQL进阶之旅 Day 20:锁与并发控制技巧

【JDK21深度解密 Day 20】锁与并发控制技巧 文章简述 在高并发的数据库环境中&#xff0c;锁与并发控制是保障数据一致性和系统稳定性的核心机制。本文作为“SQL进阶之旅”系列的第20天&#xff0c;深入探讨SQL中的锁机制、事务隔离级别以及并发控制策略。文章从理论基础入手…

Qt(part 2)1、Qwindow(菜单栏,工具栏,状态栏),铆接部件,核心部件 ,2、添加资源文件 3、对话框

1、Qwindow tips&#xff1a;1&#xff0c;首先为什么创建出的对象基本都是指针形式&#xff0c;个人觉得是对象树的原因&#xff08;自动释放内存&#xff09;&#xff0c;指针来访问成员函数->的形式。2&#xff0c;菜单栏只能一个的&#xff0c;放窗口基本Set&#xff0c…

一款“短小精悍的”手机录屏软件

这个时代&#xff0c;手机自带录屏功能已经不是什么稀奇的事情了&#xff0c;但是手机自带的录屏功能不都是完美的&#xff0c;无法静音录屏、、不能修改画质、不能剪辑、不能自定义水印......emmm.....貌似除了录屏就什么都不会 今天分享的这款软件——ADV屏幕录制汉化版&…

力扣HOT100之二分查找:153. 寻找旋转排序数组中的最小值

这道题是上一道题&#xff1a;33. 搜索旋转排序数组的前置题&#xff0c;有点没看懂力扣为什么要这样安排题目顺序&#xff0c;应该把这道题按排在前面才对啊。。。这道题的思路已经在上一道题的思路中说过了&#xff0c;这里就直接复制粘贴上一篇博客中的内容了。 我们阅读完题…