以十进制打印寄存器而不使用printf

时间:2017-01-18 00:01:32

标签: assembly x86 printf decimal

我正在尝试从屏幕上的寄存器EDX打印出值。 程序应找到最大的paranthesis深度,例如((x))EDX = 2

我不能使用stdlib。 我的程序使用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"

我读过,我需要使用modulo,并将余数推入堆栈。 这是另一种方法吗(proffesor说了一些关于改变十六进制值的东西)

更新

这应该有效,但我得到了分段错误

.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 个答案:

答案 0 :(得分:0)

好的,这是我的解决方案。

.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