自制操作系統(五、重寫引導部分和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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83933.shtml
英文地址,請注明出處:http://en.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;這里就直接復制粘貼上一篇博客中的內容了。 我們閱讀完題…