-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathio.asm
77 lines (77 loc) · 2.39 KB
/
io.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
section .text ; ñåãìåíò êîäà
IntToStr64:
push rdi
push rbx
push rdx
push rcx
push rsi
mov byte[rsi],0 ; íà ìåñòî çíàêà
cmp eax,0
jge .l1
neg eax
mov byte[rsi],'-'
.l1 mov byte[rsi+6],10
mov rdi,5
mov bx,10
.again: cwd ; ðàñøèðèëè ñëîâî äî äâîéíîãî
div bx ; äåëèì ðåçóëüòàò íà 10
add dl,30h ; ïîëó÷àåì èç îñòàòêà êîä öèôðû
mov [rsi+rdi],dl ; ïèøåì ñèìâîë â ñòðîêó
dec rdi ; ïåðåâîäèì óêàçàòåëü íà
; ïðåäûäóùóþ ïîçèöèþ
cmp ax, 0 ; ïðåîáðàçîâàëè âñå ÷èñëî?
jne .again
mov rcx, 6
sub rcx, rdi ; äëèíà ðåçóëüòàòà+çíàê
mov rax,rcx
inc rax ; äëèíà ðåçóëüòàòà+OA
inc rsi ; ïðîïóñêàåì çíàê
push rsi
lea rsi,[rsi+rdi] ; íà÷àëî ðåçóëüòàòà
pop rdi
rep movsb
pop rsi
pop rcx
pop rdx
pop rbx
pop rdi
ret
StrToInt64:
push rdi
mov bh, '9'
mov bl, '0'
push rsi ; ñîõðàíÿåì àäðåñ èñõîäíîé ñòðîêè
cmp byte[rsi], '-'
jne .prod
inc rsi ; ïðîïóñêàåì çíàê
.prod cld
xor di, di ; îáíóëÿåì áóäóùåå ÷èñëî
.cycle: lodsb ; çàãðóæàåì ñèìâîë (öèôðó)
cmp al, 10 ; åñëè 10, òî íà êîíåö
je .Return
cmp al, bl ; ñðàâíèâàåì ñ êîäîì íóëÿ
jb .Error ; "íèæå" – Îøèáêà
cmp al, bh ; ñðàâíèâàåì ñ êîäîì äåâÿòè
ja .Error ; "âûøå" – Îøèáêà
sub al, 30h ; ïîëó÷àåì öèôðó èç ñèìâîëà
cbw ; ðàñøèðÿåì äî ñëîâà
push ax ; ñîõðàíÿåì â ñòåêå
mov ax, 10 ; çàíîñèì 10 â AX
mul di ; óìíîæàåì, ðåçóëüòàò â DX:AX
pop di ; â DI – î÷åðåäíàÿ öèôðà
add ax, di
mov di, ax ; â DI – íàêîïëåííîå ÷èñëî
jmp .cycle
.Return: pop rsi
mov rbx, 0
cmp byte[rsi], '-'
jne .J
neg di
.J mov ax, di
cwde
jmp .R
.Error: pop rsi
mov rax, 0
mov rbx, 1
.R pop rdi
ret