【问题标题】:Assembly fill array with Consecutive numbers具有连续数字的程序集填充数组
【发布时间】:2017-08-25 00:26:48
【问题描述】:

我在 Assembly 中遇到了简单数组的问题。这是正确的做法吗。我需要用连续的数字填充数组,在本例中为 10。代码如下:

section .data
array TIMES 10 db 0

section .text
global _start
_start:
mov eax,10  ;counter
mov ebx,0   ;start from value 0
mov ecx,array;

loop:   
mov [ecx],ebx
inc ecx     ;increase pointer to next array element
inc ebx     ;increase inputted value
dec eax     ;decrease iterator
jnz loop    ;if iterator not 0 loop

mov eax,1   ;eit
int 0x80

那是正确的代码吗?

在使用 gdb 进行调试时。第 11 行(5 个循环)上的断点显示以下输出:

$1: $eax = 4
$2: $ebx = 6
$3: $ecx = 134516902

x/d $ecx-1   0x80490a5:   5

如何从整个数组中查找值?只有我 $ecx-1 的这个地方显示输入数字的正确值。我几乎可以肯定我的问题是我的代码。

亲切的问候

【问题讨论】:

  • x/10d $ecx-9 或类似?
  • 只有 $ecx-1 显示输入值。这段代码有这个问题吗: mov [ecx],ebx inc ecx ?我将值放在 ecx 指向的地址中,对吗?
  • 尝试将mov ecx, array 更改为lea ecx, [array]。此外,您已将数组声明为 10 个字节,但在 mov [ecx], ebx 语句中您放置了 32 位,您将丢弃该数组。如果您打算只放入一个字节,请将其更改为mov [ecx], bl

标签: arrays assembly gdb nasm


【解决方案1】:

有几种方法可以解决这个问题。在下面的示例中,我们使用 lodsb(加载大小字节字符串)指令从字节大小元素的数组中检索值。我并不是说这是最有效的方法。

  1 section .data
  2         array  db       3,1,4,1,5,9,2,6,5
  3         len.array equ   $-array
  4
  5 section .text
  6         global _start
  7 _start:
  8         lea esi, [array]  ; load array pointer
  9         mov ecx, len.array  ; use length of array as counter
 10 loop:
 11         lodsb        ; load string byte - will place loads in al;
 12         dec ecx      ; decrements ecx 
 13         cmp ecx, 0   ; 
 14         jnz loop
 15
 16 _exit:
 17
 18         mov eax,1   ;exit
 19         int 0x80

(gdb) 显示 $ax ;当您逐步执行代码时,您可以看到 ax 正在填充数组元素。

12              dec ecx
1: $ax = 3
(gdb)
13              cmp ecx, 0
1: $ax = 3
(gdb)
14              jnz loop
1: $ax = 3
(gdb)
11              lodsb
1: $ax = 3
(gdb)
12              dec ecx
1: $ax = 1
(gdb)
13              cmp ecx, 0
1: $ax = 1
(gdb)
14              jnz loop
1: $ax = 1
(gdb)
11              lodsb
1: $ax = 1
(gdb)
12              dec ecx
1: $ax = 4
(gdb)
13              cmp ecx, 0
1: $ax = 4
(gdb)
14              jnz loop
1: $ax = 4
(gdb)
11              lodsb
1: $ax = 4

【讨论】:

    【解决方案2】:

    对不起,直到现在我才意识到我最后的回答不是你问的。假定字节大小的元素。

    section .bss                                                                                                                                                            
            array:   resb 10                                                                                                                                                
    section .data                                                                                                                                                           
    
    section .text                                                                                                                                                           
            global _start                                                                                                                                                   
    _start:                                                                                                                                                                 
            lea edi, [array]    ; pointer                                                                                                                                             
            mov ecx, 0   ; element counter                                                                                                                                                   
            mov eax, 1   ; starting number                                                                                                                                                   
    loop:                                                                                                                                                                   
            mov [edi+ecx], eax   ; mov n to array element x                                                                                                                                           
    
            add ecx, 1                                                                                                                                                      
            add eax, 1                                                                                                                                                      
            cmp eax, 10                                                                                                                                                     
            jl loop                                                                                                                                                         
    
    _exit:                                                                                                                                                                  
            mov eax,1   
    

    输出:(gdb) x/8b &array

    0x80490a8 <array>:      1       2       3       4       5       6       0       0
    21              cmp eax, 10
    (gdb) 
    0x80490a8 <array>:      1       2       3       4       5       6       0       0
    22              jl loop
    (gdb) 
    0x80490a8 <array>:      1       2       3       4       5       6       0       0
    17              mov [esi+ecx], eax
    (gdb) 
    0x80490a8 <array>:      1       2       3       4       5       6       7       0
    19              add ecx, 1
    (gdb) 
    0x80490a8 <array>:      1       2       3       4       5       6       7       0
    20              add eax, 1
    (gdb) 
    0x80490a8 <array>:      1       2       3       4       5       6       7       0
    21              cmp eax, 10
    (gdb) 
    0x80490a8 <array>:      1       2       3       4       5       6       7       0
    22              jl loop
    (gdb) 
    0x80490a8 <array>:      1       2       3       4       5       6       7       0
    17              mov [esi+ecx], eax
    (gdb) 
    0x80490a8 <array>:      1       2       3       4       5       6       7       8
    

    【讨论】:

    • 谢谢,看来我的代码也是有效的。我只是在 gdb 中输入了错误的命令。感谢您,我知道我可以使用以下命令查找整个数组:x/8b &array。
    • mov [edi+ecx], eax 是一个双字存储。您每次存储重叠 3 个字节,因此前 10 个字节是正确的,但最后您写入的内容超出了您保留的 10 个字节的末尾。
    猜你喜欢
    • 1970-01-01
    • 2020-05-28
    • 2022-01-26
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 2017-08-02
    • 2012-01-14
    • 2013-07-21
    相关资源
    最近更新 更多