第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在不使用c庫printf的情況下在匯編級編程中打印整數(shù)?

如何在不使用c庫printf的情況下在匯編級編程中打印整數(shù)?

如何在不使用c庫printf的情況下在匯編級編程中打印整數(shù)?有人能告訴我純裝配以十進制格式在寄存器中顯示值的代碼?請不要建議使用打印黑客,然后與GCC一起編譯。描述:嗯,我對NASM做了一些研究和實驗,我想我可以使用c庫中的printf函數(shù)來打印一個整數(shù)。通過使用GCC編譯器編譯對象文件,我做到了這一點,一切都很公平。但是,我想要實現(xiàn)的是打印存儲在十進制形式的任何寄存器中的值。我對DOS命令行的中斷向量021h進行了一些研究,它可以顯示字符串和字符,而2或9在AH寄存器中,數(shù)據(jù)在DX中。結論:我發(fā)現(xiàn)的任何示例都沒有展示如何在不使用C庫的printf的情況下以十進制形式顯示寄存器的內(nèi)容值。有人知道如何在組裝過程中做到這一點嗎?
查看完整描述

3 回答

?
慕妹3146593

TA貢獻1820條經(jīng)驗 獲得超9個贊

您需要編寫一個二進制到十進制轉換例程,然后使用十進制數(shù)字生成要打印的“數(shù)字字符”。

你必須假設某個地方會在你選擇的輸出設備上打印一個字符。調用此子例程“print_字符”;假設它在EAX中接受字符代碼并保存所有寄存器。(如果您沒有這樣的子例程,那么您還有一個額外的問題,應該是另一個問題的基礎)。

如果在寄存器(例如EAX)中有數(shù)字的二進制代碼(例如,0-9的值),則可以通過將“零”字符的ASCII代碼添加到寄存器中,將該值轉換為該數(shù)字的字符。這很簡單,就像:

       add     eax, 0x30    ; convert digit in EAX to corresponding character digit

然后,您可以調用print_string來打印數(shù)字字符代碼。

要輸出任意值,您需要取出數(shù)字并打印出來。

從根本上說,去除數(shù)字需要與10的力量一起工作。最簡單的方法是使用10的一次冪,例如10本身。假設我們有一個除以-10的例程,它在EAX中取一個值,在edX中產(chǎn)生一個商,在EAX中產(chǎn)生一個余數(shù)。我把它作為一項練習,讓你們研究如何實現(xiàn)這樣的例程。

然后,一個簡單的例程有一個正確的想法,就是為所有的數(shù)字生成一個數(shù)字。32位寄存器將值存儲到40億,因此可能會打印10位數(shù)字。因此:

         mov    eax, valuetoprint
         mov    ecx, 10        ;  digit count to produce
loop:    call   dividebyten
         add    eax, 0x30
         call   printcharacter
         mov    eax, edx
         dec    ecx
         jne    loop

這很管用.。而是按相反順序打印數(shù)字。哎呀!那么,我們可以利用下推堆棧來存儲生成的數(shù)字,然后按反向順序將它們彈出:

         mov    eax, valuetoprint
         mov    ecx, 10        ;  digit count to generate
loop1:   call   dividebyten
         add    eax, 0x30
         push   eax
         mov    eax, edx
         dec    ecx
         jne    loop1
         mov    ecx, 10        ;  digit count to print
loop2:   pop    eax
         call   printcharacter
         dec    ecx
         jne    loop2

留作讀者練習:壓制前導零。另外,由于我們將數(shù)字字符寫入內(nèi)存,而不是將它們寫入堆棧,我們可以將它們寫入緩沖區(qū),然后打印緩沖區(qū)內(nèi)容。也是留給讀者的練習。


查看完整回答
反對 回復 2019-07-08
?
隔江千里

TA貢獻1906條經(jīng)驗 獲得超10個贊

不能評論,所以我這樣發(fā)回復。@Ira Baxter,完美答案-我只想補充一句,你不需要除以10次,因為你把寄存器CX設置為值10。只需在ax中除數(shù),直到“ax=0”為止。

loop1: call dividebyten
       ...
       cmp ax,0
       jnz loop1

您還必須在原始數(shù)字中存儲有多少位數(shù)。

       mov cx,0
loop1: call dividebyten
       inc cx

不管怎么說,IraBaxter幫助了我,只有幾種方法可以優(yōu)化代碼:)

這不僅是關于優(yōu)化,而且是格式化。當你想打印54號時,你想打印54而不是0000000054:)


查看完整回答
反對 回復 2019-07-08
  • 3 回答
  • 0 關注
  • 845 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號