x86字符输出循环

时间:2016-12-16 17:01:02

标签: x86

我正在制作一个x86汇编语言程序,我已将我的名字存储在代码的数据部分中,我想创建一个循环来一次输出一个字符。我迷失了为此做些什么。任何帮助都会很棒。我是x86的新手。到目前为止,我有:

.DATA
name DWORD 4E617465h

.CODE
main PROC
     mov eax, name
 (begin my loop here)

1 个答案:

答案 0 :(得分:2)

如果将名称存储为字符序列,这将更容易(至少在概念上)。然后,你可以从一个指向字符序列开头的指针开始,打印指向的字符,递增指针,然后继续循环,直到你到达终点。

在循环条件下,您需要某种方式来确定您是否已达到目的。您可以将字符串的长度存储为单独的整数常量,可以将某种类型的sentinel值附加到表示字符串结尾的字符序列的末尾。不巧的是,这是字符串在C中的表示方式,使用NUL字符(0)作为表示字符串结尾的标记。

类似的东西:

name  DB 'Nate', 00H


main PROC
    mov   edx, OFFSET [name]     ; get pointer to beginning of string

  TopOfLoop:
    movzx eax, BYTE PTR [edx]    ; get the current character

    ; TODO: print the current character in EAX however you want to do it:
    ;       calling the printf() standard-library function, making a BIOS call, etc.

    inc    edx                   ; increment pointer so it points to the to next character

    cmp    BYTE PTR [edx], 0     ; keep looping as long as the next character is not NUL,
    jne    TopOfLoop             ;  which we use to denote the end of the string

    xor    eax, eax              ; clear EAX register so we return 0
    ret                          ; return from main procedure
main ENDP

如果您想使用当前代码,您已经存储了与ASCII字符序列对应的整数值,那么您需要更加努力地工作。具体来说,您需要从打包的整数值中一次提取一个字节,但是您需要以 reverse 顺序执行此操作,因为x86是little-endian。

4E617465 ==> 4E 61 74 65 ==> E T A N

我不是以相反的顺序实际执行循环,而是首先将序列反转,然后以向前的方向循环它。要做到这一点,我会使用BSWAP指令,但您也可以使用XCHGROR指令进行手动执行(BSWAP更简单更快)。那会给你:

6574614E ==> 65 74 61 4E ==> N A T E

然后,一旦数字的顺序正确,我们就会一个接一个地读出它们。每次循环,我们将临时值移动8,这将推动处理后的角色。一旦临时值为0,我们将停止循环,这意味着没有剩余的字符(字节)需要处理。

类似的东西:

name  DWORD 4E617465h

main PROC
    mov   edx, DWORD PTR [name]  ; load value into EDX
    bswap edx                    ; reverse the byte order for convenience

  TopOfLoop:
    movzx eax, dl                ; get the current character

    ; TODO: print the current character in EAX however you want to do it:
    ;       calling the printf() standard-library function, making a BIOS call, etc.

    shr   edx, 8                 ; shift-right by 8, lopping off the current character,
                                 ;  and queueing up the next one to process

    test  edx, edx               ; are there any more chars to process?
    jne   TopOfLoop              ; if so, keep looping

    xor   eax, eax               ; clear EAX register so we return 0
    ret                          ; return from main procedure
main ENDP