assembly 如何在Netwide汇编程序中打印出A-Z

bn31dyow  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(124)
section .text 
    global _start
_start:

    mov eax, [inputOrder]
    mov     ecx, inputOrder
    mov     edx, inputLen
    mov     ebx, 1
    mov     eax, 4
    int     0x80
    
    mov     eax, 1
    mov     ebx, 0
    int     0x80

section .data

    inputOrder db 065,066,067,068,069,070,071,072,073,074,075,076,077,078,079,080,081,082,083,084,085,086,087,088,089,090 

    inputLen equ $ - inputOrder

我需要帮助。我需要使用循环来打印出A-Z。需要什么代码来解决这个问题?我将在此代码中添加什么来生成循环而不是 inputOrder

jtoj6r0c

jtoj6r0c1#

mov eax, [inputOrder]

此指令将0x 44434241加载到EAX寄存器,但随后您就不用它了。要删除。
一个循环按照请求,将输出一个字符,增加字符的ASCII码,并继续直到Z字符得到处理。没有必要使用实际的loop指令!

Again:
    mov     edx, 1
    mov     ecx, TheChar
    mov     ebx, 1
    mov     eax, 4
    int     0x80
    movzx   eax, byte [TheChar] ; Retrieving the variable
    inc     eax
    mov     [TheChar], al       ; Updating the variable
    cmp     al, 'Z'
    jbe     Again

    xor     ebx, ebx
    mov     eax, 1
    int     0x80

section .data

TheChar db 'A'

一个更快的版本会将所有字符一起输出。我们将使用一个循环在位于.bss部分的多用途缓冲区中构建字母顺序:

mov     eax, 'A'
Again:
    mov     [Buffer - 'A' + eax], al
    inc     eax
    cmp     al, 'Z'
    jbe     Again

    mov     edx, 26             ; All at once
    mov     ecx, Buffer
    mov     ebx, 1
    mov     eax, 4
    int     0x80

    xor     ebx, ebx
    mov     eax, 1
    int     0x80

section .bss

Buffer resb 4096

另一个版本使用堆栈作为缓冲区,并有一个迭代次数较少的循环:

mov     eax, 'YZ[\'
Again:
    push    eax
    sub     eax, 0x04040404     ; 'YZ[\' -> 'UVWX' -> 'QRST' ... -> 'ABCD'
    cmp     al, 'A'
    ja      Again
    push    eax

    mov     edx, 26             ; All at once
    mov     ecx, esp
    mov     ebx, 1
    mov     eax, 4
    int     0x80
    add     esp, 28             ; Clean stack

    xor     ebx, ebx
    mov     eax, 1
    int     0x80
zwghvu4y

zwghvu4y2#

首先你写下没有loop的代码,然后你把它推广到可以使用loop。今天,没有人使用loop,因为它太慢了,但是如果你坚持使用loop

global _start
bits 64
default rel

section .text

    shr edx, 2                  ;  edx ≔ edx div 4
    test ecx, ecx               ;   ZF ≔ ecx = 0
print:
    mov [rsi], rbp              ; rsi↑ ≔ rbp
    mov eax, edi                ;  eax ≔ edi
    mov esp, ecx                ;  esp ≔ ecx
    syscall                     ; fast system call
                                ; rax, rcx, and r11 are not preserved
    mov ecx, esp                ;  ecx ≔ esp
    lea rbp, [rbp + rbx]        ;  rbp ≔ rbp + rbx
    loopne print                ;  ecx ≔ ecx − 1
                                ; if ecx ≠ 0 ∧ ¬ZF then goto print  
    jecxz $$                    ; if ecx = 0 then goto $$ 
    shr edi, 1                  ;  edi ≔ edi div 2
exit:
    mov eax, 60                 ;  eax ≔ 60
    syscall

_start:
    mov rbp, 'ABCDEFGH'         ;  rbp ≔ 16#4847464544434241
    mov rbx, 0x0808080808080808 ;  rbx ≔ 16#0808080808080808
    mov ecx, 3                  ;  ecx ≔ 3
    setne dil                   ;  dil ≔ ¬ZF
    mov dl, bl                  ;   dl ≔ bl
    mov rsi, rsp                ;  rsi ≔ rsp
    jmp print                   ; goto print

相关问题