11 完善核心 列印整數

2021-10-01 08:20:27 字數 2280 閱讀 3431

接前兩篇部落格.

print.s中新增:

global put_int

put_int:

pushad

mov ebp, esp

mov eax, [ebp+4*9] ; call的返回位址佔4位元組+pushad的8個4位元組

mov edx, eax

mov edi, 7 ; 指定在put_int_buffer中初始的偏移量

mov ecx, 8 ; 32位數字中,16進製制數字的位數是8個

mov ebx, put_int_buffer

;將32位數字按照16進製制的形式從低位到高位逐個處理,共處理8個16進製制數字

.16based_4bits: ; 每4位二進位制是16進製制數字的1位,遍歷每一位16進製制數字

and edx, 0x0000000f ; 解析16進製制數字的每一位。and與操作後,edx只有低4位有效

cmp edx, 9 ; 數字0~9和a~f需要分別處理成對應的字元

jg .is_a2f

add edx, '0' ; ascii碼是8位大小。add求和操作後,edx低8位有效。

jmp .store

.is_a2f:

sub edx, 10 ; a~f 減去10 所得到的差,再加上字元a的ascii碼,便是a~f對應的ascii碼

add edx, 'a'

;將每一位數字轉換成對應的字元後,按照類似「大端」的順序儲存到緩衝區put_int_buffer

;高位字元放在低位址,低位字元要放在高位址,這樣和大端位元組序類似,只不過咱們這裡是字元序.

.store:

; 此時dl中應該是數字對應的字元的ascii碼

mov [ebx+edi], dl

dec edi

shr eax, 4

mov edx, eax

loop .16based_4bits

;現在put_int_buffer中已全是字元,列印之前,

;把高位連續的字元去掉,比如把字元000123變成123

.ready_to_print:

inc edi ; 此時edi退減為-1(0xffffffff),加1使其為0

.skip_prefix_0:

cmp edi,8 ; 若已經比較第9個字元了,表示待列印的字串為全0

je .full0

;找出連續的0字元, edi做為非0的最高位字元的偏移

.go_on_skip:

mov cl, [put_int_buffer+edi]

inc edi

cmp cl, '0'

je .skip_prefix_0 ; 繼續判斷下一位字元是否為字元0(不是數字0)

dec edi ;edi在上面的inc操作中指向了下乙個字元,若當前字元不為'0',要恢復edi指向當前字元

jmp .put_each_num

.full0:

mov cl,'0' ; 輸入的數字為全0時,則只列印0

.put_each_num:

push ecx ; 此時cl中為可列印的字元

call put_char

add esp, 4

inc edi ; 使edi指向下乙個字元

mov cl, [put_int_buffer+edi] ; 獲取下乙個字元到cl暫存器

cmp edi,8

jl .put_each_num

popad

ret

同樣,在print.h中新增函式的宣告.

void put_int(uint32_t num);

main.c

#include

"print.h"

void

main

(void

)

編譯、鏈結,寫到虛擬硬碟第 9 扇區。結果如圖。

大整數類(已完善)

include include include include include include using namespace std define maxn 9999 define maxsize 1000 define dlen 4 class bignum 建構函式 bignum const ...

螺旋列印整數

今天要給學生講二維陣列,搜了一下,沒什麼好的示例,找到乙個練習如下 寫一方法,列印等長的二維陣列,要求從1開始的自然數由方陣的最外圈向內螺旋方式地順序排列。1 2 3 4 5 6 20 21 22 23 24 7 19 32 33 34 25 8 18 31 36 35 26 9 17 30 29 ...

列印整數劃分結果

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 將正整數n表示成一系列正整數之和 n n1 n2 nk,其中n1 n2 nk 1,k 1。正整數n的這種表示稱為正整數n的劃分。求正整數n的不 同劃分個數。例如正整數6有如下11種不同的劃分 6 5 1 4 2,4 1 1 3 ...