IA-32初学者asm sys_write混淆

时间:2018-02-14 00:06:52

标签: linux assembly x86 nasm

我正在使用NASM,IA-32(我想)。作业是从.txt文件中获取ASCII,并使用linux shell输入重定向以十六进制格式将其打印到控制台。我想我已经找到了ascii到hex部分,但是我很难让它正确打印控制台。我确定我只是遗漏了一些小而愚蠢的东西。我只是为了测试而阅读的文件是这样简单的: ABC 123 输出应该是: 41 42 43 0A 31 20 32 20 33 20

问题发生在

_hexOut:

我尝试过更多的东西,而不是我能适应这篇文章,我无法弄清楚我哪里出错了。 我得到的唯一输出是: 41 42 43

section .text   
    global _start
_start:
    mov edx, inBuffSize         ; sys_read
    mov ecx, inBuffer           ; -
    mov ebx, 0x00               ; -
    mov eax, 0x03               ; - 
    int 0x80                    ; end sys_read

    mov [inputLen], eax
    cmp eax, 0      
    jle _exit       

_inLeft:
    mov ecx, [inCount]          ; move 
    cmp ecx, [inputLen]                       
    je _hexOut                        
    movzx eax, byte [inBuffer + ecx]             
    mov [temp], al                   
    shr al, 4                        
    mov bl, 9                     
    cmp al, bl                         
    jle _leftIsNumber             
    mov bl, 10                        
    cmp al, bl                          
    jge _leftIsLetter           

_leftIsNumber:
    mov ecx, [outCount]                 
    add al, 48                         
    mov [outBuffer + ecx], al             
    mov ecx, [outCount]               
    inc ecx                           
    mov [outCount], ecx              
    jmp _inRight               

_leftIsLetter:
    mov ecx, [outCount]                 
    add al, 55                         
    mov [outBuffer + ecx], al           
    mov ecx, [outCount]                 
    inc ecx                            
    mov [outCount], ecx                
    jmp _inRight              

_inRight:
    mov ecx, [inCount]                  
    inc ecx                            
    mov [inCount], ecx                  
    movzx eax, byte [temp]                     
    and al, 0x0F                       
    mov bl, 9                          
    cmp al, bl                         
    jle _rightIsNumber              
    mov bl, 10                         
    cmp al, bl                     
    jge _rightIsLetter            

_rightIsNumber:
    mov ecx, [outCount]                 
    add al, 48                   
    mov [outBuffer + ecx], al       
    mov ecx, [outCount]            
    inc ecx                            
    mov [outBuffer + ecx], byte 32 
    inc ecx                       
    mov [outCount], ecx             
    jmp _inLeft                

_rightIsLetter:
    mov ecx, [outCount]                 
    add al, 55             
    mov [outBuffer + ecx], al            
    mov ecx, [outCount]                 
    inc ecx                          
    mov [outBuffer + ecx], byte 32        
    inc ecx                         
    mov [outCount], ecx                 
    jmp _inLeft              

_hexOut:;------------------ PROBLEMS HERE ----------------------
   ; mov ecx, [inputLen]           
   ; mov [outCount + ecx], byte 0x0A   
   ; inc ecx                         
   ; mov [inputLen], ecx             

    mov edx, [inputLen] 
    mov ecx, outBuffer  
    mov ebx, 0x01       
    mov eax, 0x04       
    int 0x80            
;------------------------------------------------------
_exit:
    mov ebx, 0
    mov eax, 1    
    int 0x80         


section .data   


section .bss 
    inBuffer resb inBuffSize
    outBuffer resb outBuffSize
    inBuffSize equ 200
    outBuffSize equ 600
    inCount resd 1
    outCount resd 1
    temp resb 1
    inputLen resd 1   

问题的第二部分是我需要能够改变控制台中每行显示的十六进制字节数,但是在我解决第一个问题之前,我无法解决这个问题。任何朝着正确方向的推动都会受到赞赏!

0 个答案:

没有答案