我的汇编程序中的分段错误

问题描述 投票:-1回答:1

我从这个简单的启动程序中得到了一个分段错误。

我正在使用Ubuntu 16.10和qazxsw poi进行调试。在达到启动qazxsw poi之后,它停止移动到下一行。

kdbg

我使用了这些命令:

__int 80h__
linux assembly x86 nasm
1个回答
0
投票

我认为这个代码通常是公开的,所以我记得这个。

您应该使用代码作为指导来理解代码中可能存在的错误;但是,它不符合任何编码标准,因此复制粘贴并将其作为赋值转换是没有意义的;假设是这样的。

仅仅通过复制/粘贴,您永远不会提高您的汇编编程技能。

lsb_release -a ...描述:Ubuntu 16.04.3 LTS

nasm -f elf32 -g uppercase1.s -o uppercase1.o && ld -m elf_i386 uppercase1.o -o uppercase1

section .bss    ; section containing uninitialized data

BUFFLEN equ 1024    ; length of buffer
Buff: resb BUFFLEN  ; text buffer itself

section .data   ; section containing initialzed data
section .text   ; secttion containing code

global _start   ; linker needs to find the entry point!

_start:
  nop       ; this no-op keeps gdb happy

  ; read buffer full of text form stdin:
read:
    mov eax, 3  ; specify sys_read call
    mov ebx, 0  ; specify file descriptor 0 : standard input
    mov ecx, Buff ; pass offset of the buffer to read to 
    mov edx, BUFFLEN    ;  pass number of bytes to be read at one pass
    int 80h     ; call sys_read to fill the buffer
    mov esi,eax     ; copy sys_read return value for safekeeping
    cmp eax, 0   ; if eax = 0 , sys_read reached EOF on stdin
    je Done     ; jump if Equal ( to o, form compare)


; set up the register for the process buffer step: 
    mov ecx, esi    ; place the number of bytes read into ecx
    mov ebp, Buff   ; pace address of buffer into ebp
    dec ebp         ; adjust the count to offset

; go through the buffer and cnvert lowercase to uppercase characters:
Scan:
    cmp byte [ebp+ecx], 61h     ; test input char agaisnst lowercase 'a'
    jb Next         ; if Below 'a'  in ASCII, not lowercase
    cmp byte [ebp+ecx], 7Ah     ; test against lowercase 'z'
    ja Next

    sub byte [ebx+ecx], 20h ; subtract 20h to give uppercase..

Next:
    dec ecx ; Decrement counter
    jnz Scan    ; if characters reamin, loop back

; Write the buffer full of processed text to stdout:
Write:
    mov eax,4   ; Specify sys_write call
    mov ebx, 1  ; Specify file descriptor 1 : stdout
    mov ecx, Buff   ; pass the offset of the buffer
    mov edx, esi ; pass the # of bytes of data in the buffer
    int 80h     ; make sys_write kernel call
    jmp read    ; loop back and load another buffer full

Done:
    mov eax, 1  ; Code for Exit sys_call
    mov ebx, 0  ; return code of Zero
    int 80h

样本输出:

nasm -f elf -g -F stabs uppercaser1.asm
ld -m elf_i386 -o uppercaser1 uppercaser1.o
./uppercaser < inputflie
© www.soinside.com 2019 - 2024. All rights reserved.