我正在制作一个x86汇编语言程序,我已将我的名字存储在代码的数据部分中,我想创建一个循环来一次输出一个字符。我迷失了为此做些什么。任何帮助都会很棒。我是x86的新手。到目前为止,我有:
.DATA
name DWORD 4E617465h
.CODE
main PROC
mov eax, name
(begin my loop here)
答案 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
指令,但您也可以使用XCHG
和ROR
指令进行手动执行(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