乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      學 Win32 匯編[3]: 控制臺下的幾種輸出方式

       aaie_ 2012-02-21
      在熟悉指令、偽指令和匯編語法的過程中, 首先需要的是輸出顯示的手段.

      我剛開始學習時使用的是控制臺輸出, 最后發(fā)現(xiàn)既然是 Win32 匯編還是用 Debug 輸出更好.

      下面是之前嘗試出的控制臺輸出的幾種辦法:
      1、使用 MASM 提供的 StdOut 函數(shù);
      2、使用系統(tǒng) API:
      3、使用微軟 C 標準庫 msvcrt.dll 中的 printf 函數(shù).

      使用 MASM 的 StdOut 函數(shù):
      ; Test3_1.asm
      ; 測試代碼前應先建立一個控制臺工程: 文件 -> 新建工程 -> Console App ...
      
      .386
      .model flat, stdcall
      
      include masm32.inc
      include kernel32.inc
      includelib masm32.lib
      includelib kernel32.lib
      
      .data
          szText db "Hello World!", 0
      
      .code
      start:
          invoke StdOut, addr szText
          ret ;ret 是用于子程序返回的指令, 這里用它代替 ExitProcess(在沒有生成 Win32 窗口時是可以的)
      end start
      

      使用系統(tǒng) API 函數(shù):
      ; Test3_2.asm
      
      .386
      .model flat, stdcall
      
      include windows.inc
      include kernel32.inc
      includelib kernel32.lib
      
      .data
          szText db 'Hello World!', 0
      
      ;定義兩個 DWORD 類型的變量, 分別是用于輸出句柄和字符串長度
      .data?
          hOut dd ?
          len  dd ?
      
      .code
      start:
          ; 獲取控制臺輸出設備的句柄, 其返回值會放在 eax 寄存器
          invoke GetStdHandle, STD_OUTPUT_HANDLE
          ; 把獲取到的句柄給變量 hOut 
          mov hOut, eax
          ; 通過 lstrlen 函數(shù)獲取字符串長度, 返回值在 eax                        
          invoke lstrlen, addr szText      
          ; 把獲取到的字符串長度給變量 len      
          mov len, eax
          ; 輸出到控制臺, 參數(shù)分別是: 句柄、字符串地址、字符串長度; 后面是兩個指針暫用不到                           
          invoke WriteFile, hOut, addr szText, len, NULL, NULL
          ret
      end start
      
      ; 另外前面用到的 StdOut 也基本就是這樣實現(xiàn)的, 源碼在: masm32\m32lib\stdout.asm
      

      使用微軟 C 標準庫中的 printf 函數(shù); msvscrt.inc 把它聲明做 crt_printf
      ; Test3_3.asm
      
      .386
      .model flat, stdcall
      
      include msvcrt.inc
      includelib msvcrt.lib
      
      .data
          szText db 'Hello World!', 0
      
      .code
      start:
          invoke crt_printf, addr szText
          ret
      end start
      

      三種方法相比之下, 應推薦使用 C 函數(shù) crt_printf; 因為它可以方便輸出更多數(shù)據(jù)類型, 如:
      ; Test3_4.asm
      
      .386
      .model flat, stdcall
      
      include msvcrt.inc
      includelib msvcrt.lib
      
      .data
          szFmt db 'EAX=%d; ECX=%d; EDX=%d', 0
      
      .code
      start:
          mov eax, 11
          mov ecx, 22
          mov edx, 33
          invoke crt_printf, addr szFmt, eax, ecx, edx
          ret
      end start

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多