Print out register in decimal without printf

2019-09-21 05:43发布

I'm trying to print out value from register EDX on the screen. The program should find the maximum depth of paranthesis e.g for ((x)) EDX = 2

And I can't use stdlib. My program using stdlib

.intel_syntax noprefix
  .globl main
  .text

main:
pop eax #return address
pop eax #return argc
pop eax #return argv
mov eax,[eax+4] #argv[1]
sub esp,12 #return stack to the right position
lea ebx,[eax]
xor eax,eax
xor ecx,ecx
xor edx,edx


loop:
  mov al,[ebx]
  or al,al
  jz print
  cmp al,'('
  je increase
  cmp al,')'
  je decrease
  inc ebx
  jmp loop

increase:
inc ecx
cmp edx,ecx
js changeMax
inc ebx
jmp loop

changeMax:
mov edx,ecx
inc ebx
jmp loop

decrease:
dec ecx
inc ebx
jmp loop

print:
push edx
mov edx, offset mesg
push edx
call printf
add esp,8
ret
mov edx,0
ret


data:
mesg: .asciz "%d\n"

I read, that I need to use modulo, and push remainder into stack. Is it another way to do this (proffesor said something about shifting hexadecimal value)

Update

This should work, but I got segmentation fault

.intel_syntax noprefix
.text
.globl _start

_start:
op eax #return address
pop eax #return argc
pop eax #return argv
mov eax,[eax+4] #argv[1]
sub esp,12 #return stack to right position
lea ebx,[eax]
xor eax,eax
xor ecx,ecx
xor edx,edx


loop:
  mov al,[ebx]
  or al,al
  jz result 
  cmp al,'('
  je increase
  cmp al,')'
  je decrease
  inc ebx
  jmp loop

increase:
inc ecx
cmp edx,ecx
js changeMax
inc ebx
jmp loop

changeMax:
mov edx,ecx
inc ebx
jmp loop

decrease:
dec ecx
inc ebx
jmp loop

result:
mov eax, edx # moving result into eax, because of div operation

conv:
    mov ecx, 10
    xor ebx, ebx

divide:
    xor edx, edx
    div ecx
    push edx
    inc ebx
    test eax, eax
    jnz divide

next_digit:
    pop eax
    add eax, '0'
    mov [sum], eax
    dec ebx
    cmp ebx, 0
    je final
    pop eax
    add eax, '0'
    mov [sum+1], eax
    dec ebx
    cmp ebx, 0
    je final
    pop eax
    add eax, '0'
    mov [sum+2], eax
    dec ebx
    cmp ebx, 0
    je final

final:
    mov edx, 3 #length of string
    mov ecx, offset sum
    mov ebx, 1
    mov eax, 4
    int 0x80
    mov edx, 1
    mov ecx, offset msg
    mov ebx, 1
    mov eax, 4
    int 0x80
    mov eax, 1
    int 0x80

.data
msg: .ascii "\n"
sum: .byte 0, 0, 0, 0

1条回答
我只想做你的唯一
2楼-- · 2019-09-21 06:08

Ok, it's my solution.

.intel_syntax noprefix
  .globl _start
  .text

_start:
mov eax, [esp+8] #argv[0] to eax
lea ebx,[eax]
xor eax,eax
xor ecx,ecx
xor edx,edx


loop:
  mov al,byte ptr [ebx]
  or al,al
  jz result #end of the argument 
  cmp al,'('
  je increase
  cmp al,')'
  je decrease
  inc ebx
  jmp loop

increase:
inc ecx
cmp edx,ecx
js changeMax
inc ebx
jmp loop

changeMax:
mov edx,ecx
inc ebx
jmp loop

decrease:
dec ecx
inc ebx
jmp loop

result:
mov eax, edx

base:
mov ecx,10 
xor ebx, ebx 

divide:

  xor edx, edx
  div ecx
  push edx
  inc ebx
  test eax, eax
  jnz divide

to_ASCII:
  pop eax
  add eax, '0'
  mov [sum], eax
  dec ebx
  cmp ebx, 0
  je print

  pop eax
  add eax, '0'
  mov [sum+1], eax
  dec ebx
  cmp ebx, 0
  je print

  pop eax
  add eax, '0'
  mov [sum+2], eax
  dec ebx

print:
mov eax, 4
mov ebx, 1
mov ecx, offset sum
mov edx, 3 #
int 0x80

mov eax,4
mov ebx,1
mov ecx, offset msg
mov edx,1
int 0x80

mov eax,1
mov ebx,0
int 0x80



.data
msg: .asciz "\n"
sum: .byte 0,0,0,0
查看更多
登录 后发表回答