我记得好像是13年的时候?阿黎整了个小米网的讨论会。大意是各部门把过去一年里,自己觉得做的好的、和做的烂的,摆出来。
例如设计,梁师傅就整了个两个图,一好一坏对比批判一番。
到代码那块,我记得好像是海洲来讲。坏的就是整个小米网,因为他觉得小米网的代码他还是不满意,还是要一边开车一边修车。
好的,就是雷老大的一段代码,说是二十年前的。
那段代码就那么直接投影到大屏幕上,程序员弟兄们沉默一会,然后纷纷点头。
海洲发言,大意是:我不指望你们有这水平,但你们得朝这个方向努力啊!
事后我问一位程序员老铁:你们是拍马屁还是真服?我只会Hello world,看不懂。
这位后来也做了某上市公司CTO的未来大佬对我这个文科生不屑一顾:我没法和你解释。总之,雷老大写得很简练、很清晰、很干脆,这就是牛逼,而且是高层次的牛逼。
所以我觉得,应该是真牛逼。
下面请欣赏雷总1994年写的代码片段——
这段用x86汇编写成的代码(以上是代码片段)用于清除内存驻留程序,类似内存加速工具,雷军教科书般规范地注明了代码用意、时间、作者……还细腻地用符号组成了分隔符让代码更加优雅,读起来清晰、舒适,所以雷总称之为诗一般的代码其实也不算过分。
在B站2020年6月份的一个访谈直播活动中,雷总也在给后辈的寄语中不断强调代码要整洁,逻辑要无懈可击,自己写的代码要达到例程(示范程序)的程度。这一点和《代码整洁之道》的作者Bob大叔英雄所见略同了。
Bob大叔就在《代码整洁之道》提出一种观点:代码质量与其整洁度成正比。
优秀的系统往往有优秀的结构设计,层次清晰,职责单一,模块化,方便拓展和复用。功能的添加往往只是在现有的框架中添加少量代码。而且Bob大叔在《代码整洁之道》中给了我们一些行之有效的规则,涵盖从命名到重构的多个方面,只要遵循这些规则,就能编写出干净的、让人舒服的代码。
详见回答——
更多内容——
希望有一天,大家的代码都能“像诗一样优雅”!
========
赠人玫瑰,手留余香,不要忘记点赞、收藏、关注 @人民邮电出版社 哦~
一键三连,感恩有你~
下面是雷军的代码完整版,一共2000行,大家自己看看牛不牛!向雷布斯致敬!
; ; RI.ASM Revision 2.12 [ July 12, 1994 ] Revision equ 'V2.12 ' ; ; ; ; RAMinit Release 2.0 ; Copyright (c) 1989-1994 by Yellow Rose Software Co. ; Written by Mr. Leijun ; ; Function: ; Press HotKey to remove all TSR program after this program ; ; ; .......................................................................... ; Removed Softwares by RI: ; SPDOS v6.0F, WPS v3.0F ; Game Busters III, IV ; NETX ( Novell 3.11 ) ; PC-CACHE ; Norton Cache ; Microsoft SmartDrv ; SideKick 1.56A ; MOUSE Driver ; Crazy (Monochrome simulate CGA program) ; RAMBIOS v2.0 ; 386MAX Version 6.01 ; .......................................................................... ; No cancel softwares: ; Windows 3.1 MSD ; ; No removed TSR softwares: ; MS-DOS fastopen ; Buffers, Files ... (QEMM 6.0) ; QCache (386MAX 6.01) ; .......................................................................... ; COMMENT V2.04 Use mouse driver software reset function to initiation mouse 2/17/1993 by Mr. Lei and Mr. Feng V2.05 RI cannot work in Windows DOS prompt 3/9/1993 by Mr. Lei V2.06 1. When XMS cannot allocate 1K memory, RI halts. 2. RI repeat deallocates EMS memory. V2.07 HotKey Setup Error 4/25/1993 by Mr. Lei V2.08 KB Buffer V2.10 1. Release high memory blocks (EMM386 QEMM386 S-ICE 386MAX) 2. RI copies flag V2.12 1. Exists a critical error in Init 8259 procedure 2. Save [40:F0--FF] user data area dosseg .model tiny .code locals @@ org 100h Start: jmp Main org 103h True equ 1 False equ 0 MaxHandles equ 100h INT3 macro out 0ffh,al endm ; ; HotKey Status Test Var ; --------------- --------------- ; ; 7 6 5 4 3 2 1 0 417 418 496 ; . . x . x . . . Left Alt is pressed 8 2 ; x . . . x . . . Right Alt is pressed 8 8 ; . . . x . x . . Left Ctrl is pressed 4 1 ; . x . . . x . . Right Ctrl is pressed 4 4 ; . . . . . . x . Left Shift is pressed 2 ; . . . . . . . x Right Shift is pressed 1 ; LeftAlt equ 00101000b RightAlt equ 10001000b LeftCtrl equ 00010100b RightCtrl equ 01000100b LeftShift equ 00000010b RightShift equ 00000001b HotKey db LeftCtrl or RightCtrl DataBegin dw 0 NextDataSeg dw 0ffffh oldInt2F_addr dw 0, 0 XMS_control dw 0, 0 Handle_begin dw 0 cvtOfs dw 0 ; DOS 3.0 equ 0 and above DOS 4.0 is 1 org 104h db 0dh db Revision db ??date db 26 org 114h tsrLength dw 0 MachineID db 0FCh ; IBM PC/AT AuxHotKey db 0 ; 2Dh ; 'X' Scan Code AuxHotKeyName db 'X$ ' Power db True Flag db '!' Kbd102 db 0 NoFlag db 0 StopFlag db 1 DosEnv dw 0 WorkSeg dw 0 PrevDataSeg dw 0 Copies db '1' old_8259 db 0 ; 21h port db 0 ; a1h port Status dw 0 XMSbit equ 00000001b EMSbit equ 00000010b SKbit equ 10000000b GoINT1C: db 0eah oldInt1C_addr dw 0, 0 newINT1C: test cs:Status, SKbit jnz GoINT1C cmp cs:StopFlag, 0 jz @@0 ; ; Mr. Lei 2/8/1993 ; Problem: if WPS quit and reenter, old RI cann't control keyboard. ; push ds push ax xor ax, ax mov ds, ax mov ax, ds:[94] cmp ax, offset NewInt9 pop ax pop ds jnz GoINT1C mov cs:StopFlag, 0 @@0: push ax push ds push es xor ax, ax mov ds, ax mov es, ds:[94+2] cmp word ptr es:[101h], 'IE' ; 'LEI' jz @@1 cli mov cs:StopFlag, 1 mov ax, ds:[94] mov cs:oldINT9_addr2, ax mov ax, ds:[94+2] mov cs:oldINT9_addr2[2], ax mov ds:[94], offset newINT9_2 mov ds:[94+2], cs sti @@1: pop es pop ds pop ax jmp GoINT1C ; ---------------------------------------------------------------------- ; INT2F Func ; ; AX = C0D7h Return RI segment in AX ; AX = C0D8h Removes all TSR programs after RI ; AX = C0D9h Removes all TSR programs include RI ; AX = C0DAh Removes all RI copies ; ---------------------------------------------------------------------- newINT2F: cmp ax, 0c0d7h ; LEI Hanzi GB Code jnz @@1 push cs pop ax iret @@1: cmp ax, 0c0d7h+1 jnz @@2 jmp KeepSelf @@2: cmp ax, 0c0d7h+2 jnz @@3 jmp NoKeepSelf @@3: cmp ax, 0c0d7h+3 jnz @@9 mov cs:NextDataSeg, -1 mov cs:Copies, '1' jmp NoKeepSelf @@9: jmp dword ptr cs:oldInt2F_addr CallInt9: ret newINT9_2: mov cs:NoFlag, 1 pushf db 9ah ; call far ptr oldint9_addr oldInt9_Addr2 dw 0, 0 jmp newINT9_proc newINT9: pushf db 9ah ; call far ptr oldint9_addr oldInt9_Addr dw 0, 0 cmp cs:NoFlag, 0 jz newINT9_proc mov cs:NoFlag, 0 iret newINT9_proc: cmp cs:Flag, '!' ; busy ? jnz @@0 iret @@0: mov cs:Flag, '!' ; set busy flag push ax ; cmp hot key push bx push es mov ax,40h mov es,ax cmp cs:AuxHotKey, 0 jz @@_1 mov bx, es:[1ah] cmp bx, es:[1ch] jz @@10 push bx mov bl, es:[bx+1] cmp bl, cs:AuxHotKey pop bx jnz @@10 @@_1: mov ah,es:[17h] ; test CTRL SHIFT ALT mov al,cs:HotKey push ax and ax,0f0fh cmp al,ah pop ax jnz @@10 cmp cs:Kbd102, True jnz @@1 shr al, 1 shr al, 1 shr al, 1 shr al, 1 push ax mov ah, es:[18h] and ax, 303h cmp al, ah pop ax jnz @@10 mov ah, es:[96h] shr ax, 1 shr ax, 1 and ax, 303h cmp al, ah jnz @@10 cmp cs:AuxHotKey, 0 jz @@_3 inc bx inc bx cmp bx, 3eh jb @@_2 mov bx, 1eh @@_2: mov es:[1ah], bx @@_3: call IsWinDos or ax, ax jz @@1 call Beep @@10: sti pop es pop bx pop ax mov cs:Flag, ' ' ; no busy iret @@1: ; OK pop es pop bx pop ax KeepSelf: call RemoveTSR push es mov es,cs:WorkSeg mov dx,es:tsrLength mov di,dx mov al,0h ; Aug 24, 1993 mov cx,100h rep stosb pop es int 27h NoKeepSelf: mov ax,0e07h int 10h mov cs:clsStr, 47h ; Color (White in Red) call RemoveTSR dec cs:Copies call RestoreSelfIntVec push es cmp cs:PrevDataSeg, 0 jz @@1 mov es, cs:PrevDataSeg mov es:NextDataSeg, -1 @@1: pop es mov ax, 4c00h int 21h ; --------------------------------------------------------------------------- IsWinDOS: mov ax, 1600h int 2fh cmp al, 01h jz @@9 cmp al, 0ffh jz @@9 ; Windows/386 Version 2.X cmp al, 00h jz @@1 cmp al, 80h jnz @@9 ; Windows 3 in enhanced mode ; Version number in AL/AH @@1: mov ax, 4680h int 2fh cmp al, 80h jnz @@9 xor ax, ax jmp @@10 @@9: mov ax, 1 @@10: ret ; ----------------------------------------------------------------------- RestoreSelfIntVec: cmp Copies, '0' jz @@0 ret @@0: cli push cs pop ds xor ax, ax mov es, ax mov si, offset oldInt9_Addr mov di, 94 movsw movsw mov si, offset oldInt2F_Addr mov di, 2Fh4 movsw movsw mov si, offset oldInt1C_Addr mov di, 1Ch4 movsw movsw sti ret ; ------------- KERNEL PROGRAM ---------------------------------------------- RemoveTSR: pop ax cli ; Set stack mov sp, cs mov ss, sp mov sp, 100h sti push ax cmp cs:Power, True jnz @@1 call Init8259 @@1: push cs pop ds @@_0: mov ax,ds:NextDataSeg cmp ax, -1 jz @@_1 mov cs:PrevDataSeg, ds mov ds, ax jmp @@_0 @@_1: mov si,ds:DataBegin mov cs:WorkSeg, ds lodsw cmp ax, 'XX' jz @@_2 call Beep ret @@_2: call RestoreEnvStr call RestoreMCB ; restore current mcb call CloseFiles call RestorePort call RestoreLEDs call RestoreVecList ; Restore vectors list call RestoreFloppyParam cmp cs:Power, True jnz @@2 call RestoreCVTchain ; Restore cvt chain call RestoreMemoryManager @@2: call RestoreBiosData call Enable8259 mov ah, 1 int 16h call RestoreClockSpeed call CloseSpeaker call ResetDisk call UpdateTime call ClosePRN mov bx,cs:WorkSeg mov ah,50h int 21h ; Set PSP segment mov ax,3 int 10h ; Set display mode call InitPRN call InitMouse mov al, cs:Copies cmp al, '1' ja @@_sh1 mov cs:ShowCopies, '' jmp @@_sh2 @@_sh1: mov cs:ShowCopies, al @@_sh2: mov si, offset clsStr call ColorPrintStr mov cs:Flag, ' ' ; no busy cmp Copies, '1' jnz @@_end mov cs:StopFlag, 0 @@_end: call ClearKB_buffer ret Beep: mov ax,0e07h int 10h ret ; ######################################################################### ClearKB_Buffer: push es push bx mov bx, 0040h mov es, bx cli mov bx, es:[1ah] mov es:[1ch], bx sti pop bx pop es ret Init8259: ; cmp cs:Copies, '1' ; jz @@1 ; ret @@1: cmp cs:MachineID, 0fch ja @@pc_xt @@AT: mov bx,870h ; mov al,0 ; out 0F1h,al ; jcxz $+2 jcxz $+2 mov al,11h ; ICW1 out 0A0h,al jcxz $+2 jcxz $+2 out 20h,al jcxz $+2 jcxz $+2 mov al,bl ; ICW2 out 0A1h,al jcxz $+2 jcxz $+2 mov al,bh out 21h,al jcxz $+2 jcxz $+2 mov al,2 ; ICW3 out 0A1h,al jcxz $+2 jcxz $+2 mov al,4 out 21h,al jcxz $+2 jcxz $+2 mov al,1 ; ICW4 out 0A1h,al jcxz $+2 jcxz $+2 out 21h,al jcxz $+2 jcxz $+2 mov al,0FFh ; OCW1 out 0A1h,al jcxz $+2 jcxz $+2 out 21h,al ret @@PC_XT: mov al,13h ; ICW1 out 20h,al jcxz $+2 jcxz $+2 mov al,8 ; ICW2 out 21h,al jcxz $+2 jcxz $+2 mov al,9 ; ICW4 out 21h,al jcxz $+2 jcxz $+2 mov al,0FFh ; OCW1 out 21h,al ret Enable8259: mov ax, word ptr cs:old_8259 out 021h,al jcxz $+2 jcxz $+2 mov al,ah out 0a1h,al ; DEC PC Bus Mouse ret ; July 1994 by Mr. Lei ; ------------------------------------------------------------------------- RestoreBiosData: lodsw cmp ax, '--' jz @@1 call Beep ret @@1: push es push di mov di, 40h mov es, di mov di, 10h movsw mov di, 0a8h ; [40h:a8h] movsw movsw mov di, 49h mov cx, 1dh rep movsb mov di, 0f0h ; User data mov cx, 8 rep movsw pop di pop es ret ; ------------------------------------------------------------------------- RestoreMCB: push ds push es lodsw ; 'MZ' @@0: lodsw cmp ax, 'MM' jz @@1 mov es,ax xor di,di movsb movsw movsw inc ax mov bx, ds cmp ax, bx jz @@10 mov byte ptr es:[8], 0 ; Aug 24, 1993 @@10: cmp byte ptr es:[0], 'Z' jnz @@0 mov byte ptr es:[10h], 0 jmp @@0 @@1: pop es pop ds ret ; ------------------------------------------------------------------------- CloseFiles: mov ax, 5 ; Begin handle push ds push si mov cx, 15 ; Max handle sub cx, ax inc cx mov bx, ax @@1: push bx push cx mov ah, 3eh int 21h pop cx pop bx inc bx loop @@1 pop si pop ds ret ; ------------------------------------------------------------------------- RestorePort: mov di, 40h ; restore port mov es, di xor di, di mov cx, 8 rep movsw ret ; ------------------------------------------------------------------------- RestoreLEDs: lodsb and al, 11110000b ; LED status mov ah, es:[17h] and ah, 00001111b or ah, al and ah, 0f0h ; Clear CTRL ALT SHIFT mov es:[17h], ah ret ; ------------------------------------------------------------------------- RestoreEnvStr: lodsw push si push di push ds push es mov es, cs:DosEnv mov ds, ax xor si, si mov di, si @@0: lodsb or al, al jnz @@1 cmp byte ptr ds:[si], 0 jz @@2 @@1: stosb jmp @@0 @@2: stosb stosb pop es pop ds pop di pop si ret ; ----------------------------------------------------------------------- RestoreVecList: xor ax,ax mov di,ax mov es,ax mov cx,100h @@0: lodsw xchg dx, ax lodsw cmp dx, 'EL' jnz @@1 cmp al, 'I' jnz @@1 sub cl, ah push cx mov cl, ah mov ax, es:[di-4] mov dx, es:[di-2] @@a: stosw xchg ax, dx stosw xchg ax, dx loop @@a pop cx or cx, cx jz @@9 jmp @@0 @@1: xchg ax, dx stosw xchg ax, dx stosw loop @@0 @@9: ret ;---------------------------------------------------------------------------- RestoreFloppyParam: ; Mr. Lei 2/10/1992 push es push ax xor ax, ax mov es, ax mov byte ptr es:[525h], 2 pop ax pop es ret ;--------------------------------------------------------------------------- RestoreCVTchain: lodsw cmp ax, 'VC' jz @@_0 call Beep ret @@_0: push ax push cx push es ; ----------------------------------------------------------------- lodsw ; DPB mov di, ax lodsw mov es, ax @@1: lodsb inc di stosb add di, cs:cvtOfs add di, 10h movsw movsw les di, es:[di+2] cmp di, -1 jnz @@1 ; ----------------------------------------------------------------- lodsw ; DCB mov di, ax lodsw mov es, ax xor ax, ax dec ax stosw ; ----------------------------------------------------------------- lodsw ; Device Driver Chain mov di, ax lodsw mov es, ax xor cx, cx @@9: push di mov cl, 5 rep movsw pop di les di, es:[di] mov ax, di inc ax jnz @@9 pop es pop cx pop ax ret ; ---------------------------------------------------------------------------- RestoreMemoryManager: test cs:Status, XMSbit jz @@1 call LoadXMSstatus @@1: test cs:Status, EMSbit jz @@2 call LoadEMSstatus @@2: ret LoadEMSstatus: lodsw cmp ax, 'ME' jz @@_0 call Beep ret @@_0: lodsw mov cx, ax xor dx, dx @@_1: push ds push si push dx push cx @@0: cmp dx, ds:[si] jz @@1 add si, 4 loop @@0 push cx mov cx, 5 @@0: mov ah, 45h ; Deallocate Handle and Memory int 67h or ah, ah jz @@1 loop @@0 @@1: pop cx @@1: pop cx pop dx pop si pop ds inc dx cmp dx, 100h jb @@_1 shl cx, 1 shl cx, 1 add si, cx ret LoadXMSstatus: lodsw cmp ax, 'MX' jz @@_0 call Beep ret @@_0: lodsw mov cx, ax jcxz @@5 @@1: lodsw mov dx, ax @@2: push dx mov ah, 0ah ; free call dword ptr cs:xms_control or ax, ax pop dx jnz @@4 cmp bl, 0abh jnz @@4 push dx mov ah, 0dh ; unlock call dword ptr cs:xms_control or ax, ax pop dx jmp @@2 @@4: loop @@1 @@5: ret endp ; ----------------------------------------------------------------------- CloseSpeaker: in al, 61h and al, 0fch out 61h, al ret ; ----------------------------------------------------------------------- RestoreClockSpeed: mov al, 00110110b out 43h, al xor ax, ax out 40h, al out 40h, al ret ; ----------------------------------------------------------------------- ResetDisk: xor ax, ax xor dx, dx int 13h ; Restore A inc dx int 13h ; Restore B mov dl, 80h int 13h ; Restore C ret ; -------------------------------------------------------------------------- ClosePRN: mov ah, 51h ; Get PSP seg int 21h mov es, bx mov ax, es:[16h] ; Prev PSP seg cmp ax, bx jnz @@9 mov ax, 3e00h ; COMMAND mov bx, 4 int 21h @@9: ret InitPRN: mov ax, 3e00h mov bx, 4 ; PRN int 21h mov ax, 3d01h mov dx, offset PRNname push cs pop ds int 21h ret PRNname db 'PRN',0 InitMouse: ; 2/16/1993 by Mr. Lei push es xor ax, ax mov es, ax cmp word ptr es:[33h4+2], 0 jz @@0 cmp word ptr es:[33h4], 0 jz @@0 mov ax, 21h int 33h ; Hook Mouse Interrupt @@0: pop es ret ; ------------- CMOS CLOCK set to System ----------------------------------- UpdateTime: call GetRealTime mov ah, 2dh int 21h ret GetRealTime: mov ah,2 int 1Ah mov al,ch call bcdxchg mov ch,al mov al,cl call bcdxchg mov cl,al mov al,dh call bcdxchg mov dh,al mov dl,0 ret BCDxchg: push ax push cx mov cl,4 shr al,cl pop cx mov bl,0Ah mul bl pop bx and bl,0Fh add al,bl ret ; ----------------------------------------------------------------------- ; Display string ColorPrintStr: lodsb mov bh, al ; color xor cx, cx mov dx, 014fh mov ax, 0600h int 10h mov ah, 02 ; GotoXY (0, 0) xor dx, dx mov bh, 0 int 10h PrintStr: push cs pop ds xor bx, bx @@1: lodsb cmp al, '$' jz @@2 or al, al jz @@2 mov ah, 0eh int 10h jmp short @@1 @@2: mov al, cs:clsStrcolor mov cs:clsStr, al ret ; ----------------------------------------------------------------------- Self dw 0 clsStrcolor db 17h clsStr db 17h ; Color (White in Blue) db ' RAMinit Version 2.12 (c) 1989-1994 by KingSoft Ltd. Mr. Leijun' db 0dh,0ah db ' [' ShowCopies db '' db '] Activate...',0ah,0dh,'$' endTSR equ $ mcbList equ offset endTSR + 2 + 2 vecList equ mcbList + 710 + 2 + 10h + 1 + 400h devLink equ vecList + 4 + 5 26 + 4 + 10 30h + 4 xmsList equ devLink + 2 + MaxHandles 2 emsList equ xmsList + 4 + 1024 crtMode equ emsList + 2 + 1Dh + 4 + 10h tsrLen equ crtMode + 1 ; ; DOS Environment Reserved by RI ; -------------------------------------------------- ; Flag 'XX' 2 bytes ; Environment Segment 1 word ; Free MCBs <=710 bytes ; MCB segment 1 word ; MCB 5 bytes ; End flag 'MM' 1 word ; COM LPT ports 10h bytes ; LEDs status 1 bytes ; Packed vectors list <=400h bytes ; Flag 'CV' 2 bytes ; CVT First DPB pointer 4 bytes ; DPBs data <=526 bytes ; First DCB pointer 4 bytes ; Pointer to NUL 4 bytes ; All device driver datas <=30h10 bytes ; Flag 'XM' 2 bytes ; XMS free handle counter 2 bytes ; EMS free handle list <=100h4 bytes ; Flag 'EM' 2 bytes ; EMS free handle counter 2 bytes ; EMS free handle list <=1024 bytes ; EMS handle 1 word ; Number of pages 1 word ; Flag '--' 1 word ; Equipment List 1 word ; CRT 40:49h-66h 1dh bytes ; 40:A8h 1 dword ; BIOS User Data Area 40:F0--FF 10h bytes ; ** ; main: jmp main0 Print Macro Str Lea dx, Str call DisplayStr endm InstMsg db 'RAMinit Version 2.12 ' db 'Copyright (c) 1989-1994 by KingSoft Ltd. ',0dh,0ah,'$' Msg0 db 'Already installed !',0dh,0ah,0ah db 'For Help, type "RI /?". ',0dh,0ah,'$' Msg_0 db 0ah,'Residents a new RAMinit copy [y/n] ? $' Msg_2 db 'OK, RI No.' Msg_RI db '2' db ' residents successful !', 0dh,0ah,'$' Msg1 db 'Activate with: $' KeyMsg db 'Right_Shift$' db 'Left_Shift$ ' KMsg1 db 'Left_Ctrl$ ' db 'Left_Alt$ ' db 'Right_Ctrl$ ' db 'Right_Alt$ ' KMsg2 db 'Ctrl$ ' db 'Alt$ ' db 'Ctrl$ ' db 'Alt$ ' PlusMsg db ' + $' crlf db 0dh,0ah,'$' HelpMsg db 'Programmed by Mr. Leijun Dec 1992', 0dh,0ah,0ah db 'Usage: RI [options]',0dh,0ah,0ah db '/H,/? Display this screen',0dh,0ah db '/CLS Removes all TSR programs after current RI',0dh,0ah db '/RET Removes TSR programs include current RI',0dh,0ah db '/NEW Residents a new data copy of current environment',0dh,0ah db '/ALL Removes all RI copies and all other tsr programs',0dh,0ah db '/Sxyy.. Define Hotkey x=AuxHotkey yy..=shift status',0dh,0ah db ' x=auxiliary hotkey (default is "X") ',0dh,0ah db ' x equ "1" means need AuxHotkey',0dh,0ah db ' yy..=shift status [CAScas]',0dh,0ah db ' C: Left Ctrl A: Left Alt S: Left Shift',0dh,0ah db ' c: Right Ctrl a: Right Alt s: Right Shift',0dh,0ah,0ah db 'Example: "RI /S1c" means Hotkey is Right_Ctrl+X',0dh,0ah db ' "RI /S0Cc" means HotKey is Left_Ctrl+Right_Ctrl',0dh,0ah db ' "RI /CLS" equals simply press hotkey',0dh,0ah db ' "RI /RET" Removes all TSRs after current RI and this RI',0dh,0ah db 0ah db 'Contact me for RAMinit problems: (01)2561155 Call 1997',0dh,0ah db '$' ErrMsg db 'ERROR: Invalid options !',0dh,0ah,0ah,'$' WinErr db 7, 'Sorry, I cannot work in Windows DOS environment.',0dh,0ah,'$' SetMsg db 7, 'Defines new Hotkey successful !',0dh,0ah,0ah,'$' tsrOK db False Main0: cld Print instMsg call IsWinDos or ax, ax jz @@1 Print WinErr mov ax, 4c00h int 21h @@1: call HotKeyValid mov cs:Status, 0 call EMS_test call CmpDosVer call CmpSideKick call GetMachineID call ModifyHotKeyPrompt mov ax, 0c0d7h int 2fh mov es, ax cmp word ptr es:[101h], 'IE' ; 'LEI' jnz @@0 mov cs:Self, ax @@0: call CmdLine call PrintHotKeyPrompt cmp cs:tsrOK, true jz @@2 call tsrReplyOK @@2: cmp cs:tsrOK, true jnz @@_2 call PrintCopies @@_2: mov word ptr cs:[100h], 'EL' mov byte ptr cs:[102h], 'I' push cs pop es push cs pop ds std mov si, offset eof mov cx, eof - offset Here mov di, tsrLen add di, cx inc cx rep movsb cld mov bx, tsrLen jmp bx Here: mov ax,cs mov es,ax mov di,offset endTSR mov cs:DataBegin, di mov cs:NextDataSeg, -1 mov ax, 'XX' stosw in al, 0a1h mov ah, al in al, 21h push ax mov word ptr cs:old_8259, ax xor ax, ax out 21h,al ; CLI call SaveOthers call SetSelfInt call BackupVecList cmp cs:Power, true jnz @@20 call BackupCVTchain call BackupMemoryManager @@20: call BackupBiosData sti mov cs:Flag, ' ' ; no busy mov cs:StopFlag, 0 ; mov cs:tsrLength, di call SetDosEnvSeg cmp cs:Self, 0 jz @@29 push cs pop ds push cs pop es cld mov cx, cs:tsrLength mov si, cs:DataBegin sub cx, si mov di, 120h mov cs:DataBegin, di rep movsb mov cs:tsrLength, di @@29: pop ax out 21h, al ; STI mov al, ah out 0a1h, al mov dx, cs:tsrLength inc dx int 27h ; ---------------------------------------------------------------------------- SetDosEnvSeg: push ds push es mov ax, cs @@10: mov es, ax mov ax, es:[16h] ; Get father process psp segment or ax, ax jz @@11 mov bx, es cmp ax, bx jnz @@10 @@11: mov es, word ptr es:[2ch] ; Get father process env segment mov cs:DosEnv, es pop es pop ds ret ; ---------------------------------------------------------------------------- SaveOthers: mov ax, cs:[2ch] ; Env Seg stosw call backupMCB ; Current MCB mov ax, 40h ; COM LPT Port mov ds, ax mov si, 0h mov cx, 8 rep movsw mov si, 17h ; LED status lodsb stosb ; call OpenLEDs ret ; -------------------------------------------------------------------------- backupMCB: mov ax, 'ZM' stosw push ds push es mov ah, 52h int 21h ; Get MCB chain head mov ax, es:[bx-2] pop es @@0: mov ds, ax cmp byte ptr ds:[0], 'Z' ; End ? jz @@20 cmp byte ptr ds:[0], 'M' ; Memory control block jnz @@30 cmp word ptr ds:[3], 0 ; Nul mcb jz @@10 cmp word ptr ds:[1], 0 ; Free MCB jnz @@10 call SaveFreeMCB @@10: inc ax add ax, ds:[3] jmp @@0 @@20: call SaveFreeMCB cmp ax, 0a000h inc ax jnb @@30 mov ax, 9fffh ; MS-DOS UMB jmp @@0 @@30: cmp ax, 0c000h ; 386MAX ja @@90 mov ax, 0c020h jmp @@0 @@90: ; Error ? pop ds mov ax, 'MM' ; Set MCB flag stosw ret SaveFreeMCB: stosw xor si,si movsb movsw movsw ret ; ; push ax ; stosw ; xor si,si ; movsb ; movsw ; movsw ; pop ax ; cmp ax, 09fffh ; jnb @@3 ; push ax ; push ds ; mov ds,ax ; cmp byte ptr ds:[0], 'M' ; pop ds ; pop ax ; jnz @@4 ; mov ax, 09fffh ; MS-DOS UMB ; jmp @@0 ; @@4: cmp ax, 0c000h ; ja @@3 ; mov ax, 0c020h ; 386MAX ; jmp @@0 ; ; -------------------------------------------------------------------------- OpenLEDs: push ax ; Open all LEDs or al, 070h mov ds:[17h], al mov ah, 1 int 16h mov cx, 4 ; Delay @@20: push cx xor cx, cx @@21: loop @@21 pop cx loop @@20 pop ax mov ds:[17h], al mov ah, 1 int 16h ret ; -------------------------------------------------------------------------- SetSelfInt: push es push di cmp cs:self, 0 jnz @@1 push cs pop ds mov ax,3509h int 21h mov word ptr cs:oldInt9_addr,bx mov word ptr cs:oldInt9_addr[2],es mov dx,offset NewInt9 mov ax,2509h int 21h mov ax,352Fh int 21h mov word ptr cs:oldInt2F_addr,bx mov word ptr cs:oldInt2F_addr[2],es mov dx,offset newInt2F mov ax,252Fh int 21h mov ax,351Ch int 21h mov word ptr cs:oldInt1C_addr,bx mov word ptr cs:oldInt1C_addr[2],es mov dx,offset newInt1C mov ax,251ch int 21h cli jmp @@2 @@1: mov es, cs:Self inc es:Copies @@_0: cmp es:NextDataSeg, -1 jz @@_1 mov es, es:NextDataSeg jmp @@_0 @@_1: mov es:NextDataSeg, cs @@2: pop di pop es ret ; ----------------------------------------------------------------------- SaveCounter: mov word ptr es:[di], 'EL' mov byte ptr es:[di+2], 'I' mov byte ptr es:[di+3], bl xor bx, bx add di, 4 ret ; ----------------------------------------------------------------------- DisplayStr: push cs pop ds mov ah, 9 int 21h ret ; ----------------------------------------------------------------------- CmdLine: push cs pop ds xor ax, ax mov si, 80h lodsb or al, al jnz @@1 ret @@1: mov cx, ax dec ax push ax push si @@0: lodsb cmp al, ' ' jz @@0 cmp al, '/' jnz @@2 lodsb cmp al, 'S' jz @@_2 cmp al, 's' jnz @@2 @@_2: call SetHotKey Print SetMsg mov ax, 4c00h int 21h @@2: pop si pop ax push ax push si @@_3: lodsb cmp al, 'A' jb @@3 cmp al, 'Z' ja @@3 add byte ptr ds:[si-1],20h ; DownCase @@3: loop @@_3 pop si pop cx add si, cx lodsb cmp al, 's' ; CLS jnz @@5 cmp word ptr ds:[si-3], 'lc' jnz @@5 cmp cs:Self, 0 jz @Err mov ax, 0c0d7h+1 int 2fh @@5: cmp al, 'h' ; HELP jz @help cmp al, '?' jz @help cmp al, 't' ; RET jnz @@6 cmp word ptr ds:[si-3], 'er' jnz @@6 @@7: cmp cs:Self, 0 jz @Err mov ax, 0c0d7h+2 int 2fh @@6: cmp al, 'w' ; NEW jnz @@8 cmp word ptr ds:[si-3], 'en' jnz @@8 mov cs:tsrOK, true ret @@8: cmp al, 'l' ; ALL jnz @@9 cmp word ptr ds:[si-3], 'la' jnz @@9 mov ax, 0c0d7h+3 int 2fh @@9: cmp al, ' ' jnz @Err ret @Err: Print ErrMsg @help: Print HelpMsg mov ax, 4c00h int 21h ;--------------------------------------------------------------------------- tsrReplyOK: cmp cs:Self, 0 jz @@1 Print Msg0 push es mov ax, cs:Self @@_10: mov es, ax mov ax, es:NextDataSeg cmp ax, -1 jnz @@_10 mov ax, es @@_0: push ax dec ax mov es, ax mov bx, es:[3] pop ax add ax, bx inc ax mov es, ax cmp word ptr es:[0], 'OC' jz @@_0 mov bx, cs cmp ax, bx pop es jz @@2 Print Msg_0 mov ah, 1 int 21h push ax Print crlf pop ax cmp al, 'y' jz @@3 cmp al, 'Y' jz @@3 @@2: ; Print Msg_1 mov ax, 4c01h int 21h @@3: @@1: mov cs:tsrOK, true ret PrintCopies: cmp cs:Self, 0 jz @@1 push es ; Added -by- Mr. Lei mov es, cs:Self ; Aug 24, 1993 mov al, es:Copies inc al ; Total RI copies push ax ; Set es = current mcb mov ax, cs dec ax mov es, ax pop ax mov cx, 5 ; Search end of file name mov bx, 8 @@10: inc bx cmp byte ptr es:[bx], 20h jz @@20 cmp byte ptr es:[bx], 0ffh jz @@20 cmp byte ptr es:[bx], 00h jz @@20 loop @@10 @@20: ; Set current RI no mov byte ptr es:[bx], ':' ; "RI:2" mov byte ptr es:[bx+1], al cmp bx, 8+7 jnb @@30 mov byte ptr es:[bx+2], 0 @@30: pop es mov cs:Msg_RI, al Print Msg_2 @@1: ret ;--------------------------------------------------------------------------- ; Backup Interrupt Vector List ; BackupVecList: push ds push cs pop es xor si,si ; Vectors mov ds,si movsw movsw xor bx, bx mov cx,00ffh @@0: lodsw xchg dx, ax lodsw cmp ax, es:[di-2] jnz @@1 cmp dx, es:[di-4] jz @@2 @@1: or bx, bx jz @@3 call SaveCounter @@3: xchg dx, ax stosw xchg dx, ax stosw loop @@0 jmp @@4 @@2: inc bx loop @@0 call SaveCounter @@4: pop ds ret ; ;----------------------------------------------------------------------------- BackupCVTchain: mov ax, 'VC' stosw push ax push bx push cx push ds push es mov ah, 52h int 21h ; ES:BX -- DOS table as described below ; -------------------------------------------------------------------- push es ; DPB chains push bx lds si, es:[bx] push cs pop es mov ax, si stosw mov ax, ds stosw mov bx, cs:cvtOfs xor cx, cx @@1: mov al, ds:[si+1] stosb mov ax, ds:[si+bx+12h] stosw mov ax, ds:[si+bx+14h] stosw inc cx lds si, ds:[si+bx+18h] cmp si, -1 jnz @@1 ; mov ax, 5 ; mul cl ; add ax, 4 ; add cs:tsrLength, ax pop bx pop es ; -------------------------------------------------------------------- push es ; DCB file control blocks push bx les bx, es:[bx+4] @@11: cmp word ptr es:[bx], -1 jz @@10 les bx, es:[bx] jmp @@11 @@10: mov ax, es xchg ax, bx push cs pop es stosw xchg ax, bx stosw pop bx pop es ; add cs:tsrLength, 4 ; --------------------------------------------------------------------- push es ; Device Driver Chains pop ds add bx, 22h mov si, bx ; NUL pop es mov ax, si stosw mov ax, ds stosw xor cx, cx xor bx, bx @@9: push si mov cl, 5 rep movsw inc bx pop si lds si, ds:[si] mov ax, si inc ax jnz @@9 pop ds pop cx pop bx pop ax ret ; ---------------------------------------------------------------------------- BackupBiosData: mov ax, '--' stosw push ds push si mov si, 40h mov ds, si mov si, 10h movsw mov si, 0a8h movsw movsw mov si, 49h mov cx, 1dh rep movsb mov si, 0f0h mov cx, 8 rep movsw pop si pop ds ret ; --------------------------------------------------------------------------- BackupMemoryManager: push cs pop es push ds push es call SaveXMSstatus call SaveEMSstatus pop es pop ds ret ;--------------------------------------------------------------------- SaveEMSstatus: test cs:status, EMSbit jnz @@1 ret @@1: mov ax, 'ME' stosw inc di inc di push di mov ah, 4dh int 67h pop di mov es:[di-2], bx shl bx, 1 shl bx, 1 add di, bx ret ; ------------------------------------------------------------------- SaveXMSstatus: call XMS_test test cs:status, XMSbit jnz @@1 ret @@1: mov ax, 'MX' stosw mov dx, 1 call XMS_alloc jnz @@_1 xor cx, cx ; XMS alloc failure stosw ret @@_1: push dx sub dx, MaxHandles 10 @@2: push dx call XMS_Lock pop dx jnz @@3 cmp bl, 0a2h jnz @@4 add dx, 10 jmp @@2 @@3: push dx call XMS_unlock pop dx @@4: mov cs:handle_begin, dx pop dx push dx call XMS_bstat xor cx, cx mov cl, bl inc cx pop dx call XMS_Free mov dx, cs:Handle_begin push cx push cs pop es mov ax, cx stosw @@5: push dx call XMS_Lock pop dx jnz @@6 cmp bl, 0a2h ; Handle invalid jz @@7 @@6: call XMS_unlock add dx, 10 jmp @@5 @@7: mov ax, dx stosw add dx, 10 loop @@5 pop cx ret ; ------------------------------------------------------------------ XMS_test: push es mov ax, 4300h int 2fh cmp al, 80h jnz @@9 mov ax, 4310h int 2fh mov cs:XMS_control, bx mov cs:XMS_control[2], es or cs:Status, XMSbit @@9: pop es ret XMS_stat: mov ah, 0 call dword ptr cs:xms_control mov hma_exist, dl ret hma_exist db 0 XMS_alloc: mov ah, 9 call dword ptr cs:xms_control or ax, ax ret XMS_lock: mov ah, 0ch call dword ptr cs:xms_control or ax, ax ret XMS_unlock: mov ah, 0dh call dword ptr cs:xms_control or ax, ax ret XMS_bstat: mov ah, 0eh call dword ptr cs:xms_control or ax, ax ret XMS_free: mov ah, 0ah call dword ptr cs:xms_control or ax, ax ret ; ---------------------------------------------------------------------------- EMS_test: push cs pop ds mov dx, offset EMMname mov ax, 3d00h int 21h jc @@2 mov bx, ax mov ah, 3eh int 21h or cs:Status, EMSbit @@2: ret EMMname db 'EMMXXXX0',0 ; ----------------------------------------------------------------------------- SetHotKey: xor bx, bx lodsb push ax @@1: lodsb cmp al, 0dh jz @@9 cmp al, 'C' jnz @@2 or bl, LeftCtrl jmp @@1 @@2: cmp al, 'c' jnz @@3 or bl, RightCtrl jmp @@1 @@3: cmp al, 'A' jnz @@4 or bl, LeftAlt jmp @@1 @@4: cmp al, 'a' jnz @@5 or bl, RightAlt jmp @@1 @@5: cmp al, 'S' jnz @@6 or bl, LeftShift jmp @@1 @@6: cmp al, 's' jnz @@7 or bl, RightShift jmp @@1 @@7: pop ax jmp @Err @@9: mov cs:HotKey, bl pop ax mov cs:AuxHotKey, 2dh ; 'X' scan key cmp al, '1' jz @@29 mov cs:AuxHotKey, 0 @@29: cmp cs:Self, 0 jz @@30 push es mov es, cs:Self mov es:HotKey, bl mov bl, cs:AuxHotKey mov es:AuxHotKey, bl pop es @@30: call GetRunFileName mov ax, 3d02h int 21h jc @@10 push cs pop ds mov bx, ax mov cx, 4 mov dx, 100h mov ah, 40h int 21h jc @@10 mov ax, 4200h xor cx, cx mov dx, 17h int 21h jc @@10 mov cx, 1 mov dx, offset AuxHotKey mov ah, 40h int 21h jc @@10 mov ah, 3eh int 21h @@10: ret ; ----------------------------------------------------------------------- GetRunFileName: ; Return: ; DS:DX Pointer of this run file name ASCIIZ string push ax push bx push cx push si push di push es push cs pop es mov ax, es:[2ch] mov es, ax xor di, di mov cx, 1000h xor al, al @@1: repnz scasb cmp es:[di], al loopnz @@1 mov dx, di add dx, 3 push es pop ds pop es pop di pop si pop cx pop bx pop ax ret ; --------------------------------------------------------------------------- GetMachineID: push es mov KBD102,True mov ax,40h mov es,ax test byte ptr es:[96h], 00010000b jnz @@1 mov Kbd102,False @@1: xor ax,ax dec ax mov es,ax mov al,es:[0eh] mov cs:MachineID, al pop es ret ; --------------------------------------------------------------------------- ModifyHotKeyPrompt: cmp cs:Kbd102, True jz @@9 push cs pop es push cs pop ds mov cx, 124 mov si, offset KMsg2 mov di, offset KMsg1 rep movsb @@9: cmp cs:MachineID, 0fch jna @@10 mov cs:clsStrcolor, 70h ; Mono mov cs:clsStr, 70h @@10: ret ; --------------------------------------------------------------------------- PrintHotKeyPrompt: Print Msg1 mov al, cs:HotKey mov ah, al shr al, 1 shr al, 1 and ax, 33ch or al, ah mov dx, offset KeyMsg @@40: or ax, ax ; Mr. Lei 4/25/1993 jz @@_42 shr al, 1 push ax jnc @@41 push ax call ColorDisplayStr ; mov ah, 9 ; int 21h pop ax or al, al jz @@42 push dx mov dx, offset PlusMsg call ColorDisplayStr ; Print PlusMsg pop dx @@41: add dx, 12 pop ax jmp @@40 @@42: pop ax @@_42: cmp cs:AuxHotKey, 0 jz @@43 cmp cs:HotKey, 0 ; Mr. Lei jz @@_43 mov dx, offset PlusMsg call ColorDisplayStr ; Print PlusMsg @@_43: mov dx, offset AuxHotKeyName call ColorDisplayStr ; Print AuxHotKeyName @@43: Print crlf ret ColorDisplayStr: push bx push cx push dx push si mov bl, 0fh mov si, dx xor bh, bh mov cx, 1 @@1: lodsb cmp al, '$' jz @@2 or al, al jz @@2 push cx mov ah, 09h int 10h mov ah, 3 int 10h inc dl mov ah, 2 int 10h pop cx jmp short @@1 @@2: pop si pop dx pop cx pop bx ret ; --------------------------------------------------------------------------- CmpSideKick: xor ax, ax mov es, ax les bx, es:[20h] cmp word ptr es:[bx-4], 4b53h jnz @@1 cmp word ptr es:[bx-2], 4942h jz @@2 @@1: mov es, ax les bx, es:[94h] cmp word ptr es:[bx-2], 4b53h jz @@2 ret @@2: or cs:Status, SKbit ret ; --------------------------------------------------------------------------- CmpDosVer: mov ah, 30h int 21h cmp al, 3 jb @@1 cmp al, 3 jna @@2 mov cs:cvtOfs, 1 ret @@2: mov cs:cvtOfs, 0 ret @@1: Print DosVerErr mov ax, 4cffh int 21h DosVerErr db 'Sorry, DOS version too lower !',0dh,0ah,'$' HotKeyValid: cmp cs:HotKey, 0 jnz @@_1 cmp cs:AuxHotKey, 0 jnz @@_1 Print HotKeyErr mov ax, 4cfeh int 21h @@_1: ret HotKeyErr db 'Sorry, please setup hotkey again. ',0dh,0ah,'$' eof: ends end Start ; ------------- The End ! ---------------------------------------------------
最后,推荐一本阿里P8大佬撰写的算法笔记,刷完应该是超过雷军了
雷军22年前写的汇编代码,大家看看牛不牛:
电脑和编程是雷军人生中最大的兴趣,关于电脑和编程,雷军是这么说的:
程序员活在自己想象的王国里!
我刚接触电脑就发现电脑的妙处,电脑远没有人那么复杂。
如果你的程序写得好,你就可以和电脑处好关系,就可以指挥电脑干你想干的事。
这个时候你是十足的主宰。
每每你坐在电脑面前,你就是在你的王国里巡行,这样的日子简直就是天堂般的日子。
电脑里的世界很大,编程人是活在自己想象的王国里。
你可以想象到电脑里细微到每一个字节、每一个比特的东西。
我爱编程这个工作,可以肯定我会干上一辈子
正是因为热爱,所以雷军一干就是10多年。
雷军认为编程是技术,也是一种艺术,程序员需要有类似艺术家对艺术一般的追求,才能真正打造出好的产品!
雷军的技术为什么这么牛逼?他在一次采访中说过一段话:我尤其喜欢阅读计算机经典书籍,那是一种如饥似渴的感觉!
另外我把大学和工作中用的经典电子书库(包含数据结构、操作系统、C++/C、网络经典、前端编程经典、Java相关、程序员认知、职场发展)、面试找工作的资料汇总都打包放在这了,这套资源可不是一般那种网上找的资源,是伴随我从学生一路成长为腾讯高级开发工程师,360技术经理、360技术总监、中小公司CTO的打包全套,非常宝贵!点击下方链接直达获取:
点击下方链接直接获取:
雷军20年前写过一篇文章:《我会当一辈子程序员》。
看完你会知道,编程在雷军的眼里是什么样子。
有的人学习编程技术,是把高级程序员做为追求的目标,甚至是终身的奋斗目标。
后来参与了真正的商品化软件开发后,反而困惑了,茫然了。
一个人只要有韧性和灵性,有机会接触并学习电脑的编程技术,就会成为一个不错的程序员。
刚开始写程序,这时候学得多的人写的好,到了后来,大家都上了一个层次。
谁写的好只取决于这个人是否细心、有韧性、有灵性。掌握多一点或少一点,很快就能补上。
成为一个高级程序员并不是件困难的事。
当我上学的时候,高级程序员也曾是我的目标,我希望我的技术能得到别人的承认。
后来发现无论多么高级的程序员都没用。
关键是你是否能够出想法出产品,你的劳动是否能被社会承认,能为社会创造财富。
成为高级程序员绝对不是追求的目标。
编程不仅仅是技术,还是艺术。
有人认为编程是一种熟练工种,也有人把编程说成是艺术创作。这两种意见争论比较激烈。
我们换个工种来看,石匠应该是熟练工种,属于工人,更和艺术似乎沾不上边。
但正是这些石匠,给我们留下多少文物古迹,如乐山大佛、莫高窟等等。
应该说这些石匠给我们留下了无穷的文化财产。
现代软件工业已具相当规模,很多软件的完成需要的是大兵团作战。
一名普通程序员接受编写某一模块的任务后,往往只是写代码,发挥的余地很小。
在大项目中,很多程序员只能了解到和自己所编模块相关的很局部的细节。
另外还受到开发环境的限制,真的很难体会到自己在从事”艺术”创造,更多的时候是感到自己在从事重体力劳动。
有的时候还担心自己苦苦参与的这个项目究竟有没有意义,是不是在同类产品中有竞争力,会不会开发出来以后就因为硬件的发展,操作系统的换代而过时……
我认为编程的工作和石匠比较相似,有技术活,更多的是体力活。
不管怎么说,写出一个好软件不是一件容易的事。
这两种想法都有片面性,编程应该说两种属性都有。
编程不仅仅是技术,也还是艺术。编程是技术活,才有可能大规模进行,才会有软件工程和软件工厂。
也正是编程是艺术,才会有如此多的好产品,让大家如痴如醉。
关于雷军的代码水平,他自己也说过:
另外,程序员多刷算法题好处多多,想要跟雷军一样长期在编程世界里遨游,先精通算法简直是必须的,算法厉害的人进大厂非常容易,再次推荐这本阿里P8大佬撰写的Leetcode刷题笔记,它帮助我身边不少朋友加入大厂:
祝大家前程似锦,在编码的道路上一马平川。
看看这本书的目录和排版!相当经典!
PS:感谢大家的阅读,觉得不错双击点赞下呀,这里也送大家一套我花1个月时间整理的超级硬核书单,总计200本书籍,希望对大家有用:
点个赞,一键三连呗,硬核码字不易。
雷军的优秀是毋庸置疑的,在武汉大学,他两年学完计算机系四年的课程,大二就完成了毕业设计,汇编语言更是武大三十年以来仅有两个满分之一,大三就开始写加密软件、杀毒软件、财务软件、CAD软件等。至于老雷的代码水平,大家看看吧,
反正我这个菜鸡是编不出来啊,大兄弟你们怎么样;
雷军当年可是黄玫瑰工作室的创始人呀,90年代左右,满大街的盗版工具软件光盘里面都是他们软件工作室开发的那些解密软件,我们当时用的很多正版软件都是用他们编的解密软件破壳的哦。
其实很多IT名人现在看起来好像只负责管理,不懂技术,其实他们中的不少人也是程序高手,除了雷军之外,还有他的老对头周鸿祎,当年可是中国第一个Windows平台上的电子邮件客户端的开发者哦,再往远处说,当年新浪创始人王志东,也是当年名满Windows 3.1的中文平台,中文之星的开发者。
所以说,不要以为他们只是通过管人管事而出名,他们自己本身也是实力超强的技术高手,才能看准技术的潮流呀。
老实说,我对穿越技术比对这个问题感兴趣多了,为什么大家那么喜欢cos呢?成天幻想着自己是托洛茨基同志,在红场上对红军战士招手吗?能赚几个毛主席啊?洗洗睡吧,cos有风险。
不是很懂现在人怎么买啥都成投资了,买车也要核算一下机会成本了,买手机也要考虑卖二手了,买游戏主机也要考虑跌价了,买游戏卡带也要考虑好不好出手了。
车是消费品啊,什么手机电脑主机卡带也都是消费品,消费品就是用来让你用,感受效用的。
你需要这个效用,它能提供这个效用,它的价格受供求关系影响最终维持在一个你愿意接受的水平,这就够了。
你要是不需要这个效用你就不买呗,如果你的城市真有良好的公共交通,确实省钱,省时间还省力,那你就别买呗。你买了难道不是你需要么?既然需要那还说什么呢。。
要我说,撸串才是一生最坏的投资,变成了肥肉你还得花时间、金钱和精力去减肥,可能还会带来未来潜在医疗成本。那为什么撸串摊子还是这么火?因为爽啊,因为它提供的效用我们确实需要啊。
所以不要干什么事都用投资思维去理解,这样会成为资本增殖的奴隶的。生产的目的是为了让人得到效用,而不是让生产进一步扩大。
湘潭老人家如果自称NO2,无人敢称NO1