接前兩篇部落格.
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 ...