2014-11-26 2 views
0

'00000000 $'와 같은 숫자 문자열을 변경하고 문자열을 파일로 인쇄하려고합니다. 로 파일을 인쇄 할 다음어셈블리 : 문자열의 문자 변경

nr db '00000000$' 


asdf PROC near 

mov bx, offset nr 
add bx, 7 
mov [bx], '0' 
dec bx 
mov [bx], '4' 
dec bx 
mov [bx], '0' 
dec bx 
mov [bx], '3' 
dec bx 
mov [bx], '0' 
dec bx 
mov [bx], '2' 
dec bx 
mov [bx], '0' 
dec bx 
mov [bx], '1' 
ret 

asdf ENDP 

과 :

mov bx, FHandle 
mov cx, 8 
mov ah, 40h 
int 21h 

내가 '2'와 뒤에 인쇄 된 7 공백이있는 파일을 가져 예를 들어

나는 이런 식으로 뭔가를 사용하는 경우. 인쇄를 잘못하고 있는지 또는 문자열을 잘못 변경했는지 확실하지 않습니다.

+0

정보가 충분하지 않습니다. – ooga

+0

@ooga 나는 그것을 약간 편집했지만, 내가 추가 할 수있는 것이 무엇인지는 잘 모른다. – user3633384

+0

그럼 출력을하는 것은 무엇이든간에 '0'을 공간으로 변환하는 것이 좋습니다. 왜냐하면 코드가 거기에 놓인 다른 모든 문자와 올바르게 작동하기 때문에 "0"문자도 거기에 넣을 가능성이 큽니다. 아마도 디버거를 사용하고, 코드를 한 단계 수행하고, * 메모리를 관찰해야합니다. –

답변

-1

변수에 문자 값을 쓰려면 destination index (rdi x86_64, edi x86)을 사용하십시오. 그것은 여러 가지 다른 방법으로 수행 될 수 있지만 이것은 간단합니다. 다음은 모두 1's0's으로 변경하고 공간을 0으로 변경합니다. (변경, 단지 사람에 루프 카운터를 제한하는 rcx8에 :

section .data 

    dnln db 0xa,0xa 
    bfield db '11111111 ' 

section .bss 

section .text 
       global _start 

     _start: 

       mov  rdi, bfield   ; put address of bfield in rdi 
       mov  cx, 9    ; set loop counter to 9 

     _fill:        ; loop label for fill 
       mov  [rdi], byte '0'  ; move '0' into address 
       inc  rdi     ; increment address 
       loop _fill    ; loop 

       mov  rax, 1    ; print bfield 
       mov  rdi, 1 
       mov  rsi, bfield 
       mov  rdx, 9 
       syscall 

       mov  rax, 1    ; print 2 newlines 
       mov  rdi, 1 
       mov  rsi, dnln 
       mov  rdx, 2 
       syscall 

     exit: 
       xor  rdi, rdi 
       mov  rax, 0x3c 
       syscall 

빌드/링크 :

nasm -f elf64 -o zero_64.o zero_64.asm 
ld -o ./bin/zero_64 zero_64.o 

출력 :

$./bin/zero_64 
000000000 

참고 :이 질문은 ori 인 것처럼 대답합니다. 공개적으로 게시 됨. 파일에 쓰는 것이 원래 질문의 일부는 아니지만 파일 설명자가 (rax/eax)로 반환 된 __NR_creat 호출 (85 x86_64 또는 8 x86)을 사용하여 파일을 간단하게 만들 수 있습니다. 여전히 어려움이 있다면 의견을 남기십시오.

+0

downvote가있는 경우, downvote를 설명하기 위해 성실을 가져주십시오. 답을 게시 한 후 질문이 완전히 변경된 것을보고 놀랐습니다. –

+0

나는 downvoting 아니에요하지만 OP는 x86_64를 사용하지 않는 것 같아 –

+2

OP는 분명히 MS-DOS를위한 MASM/TASM을 사용하고 있습니다. Linux64 용 NASM의 답변은 조업으로 추정 할 수 있습니다. – rkhb