assembly 添加已定义字节数据(db)导致溢出,如何获得实际值?

zed5wv10  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(112)

大家晚上好,我面临的问题是尝试将所有字节定义的值0x 00,0x 10,0x 20,0x 30,0x 40,0x 50,0x 60,0x 70,0x 80,0x 90相加,并求平均值,即除以10。

%include "io.inc"

SECTION .text

global CMAIN

CMAIN:

mov ebp, esp                      ; for correct debugging
SUB AX, AX                        ; clear the register AX
MOV ECX, 0x000A                   ; set counter to 10
MOV ESI, 0                        ; set offset to 0

AW:                               ; Destination of Loop AW as long as counter != 0
                                  
ADD AL,[ds:data + ESI]            ; Add data in the data array into AL
ADD ESI, 1                        ; Increase ESI and move along the data array
LOOP AW                           ; Loop to label AW,CX=CX-1 Keep looping until CX= 0

SUB EDX, EDX                      ; Clear EDX
MOV CX, 0x000A                    ; Set the divider to 10 data
DIV CX                            ; Divide AX with CX, AX = AX / 10
MOV [ds:result], EAX              ; The result is stored into location pointed by result
PRINT_HEX 4, result               ; Display "result" in the output window
    ret                           ; end program

SECTION .data

data db 0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90
result db 0x0

我试过了,这是我能得到的最接近的。最初我使用EAX而不是AL(取最低有效8位),值非常大,不是想要的。
这里我把所有的值加在一起,但是它溢出了,结果是十六进制的值14而不是实际的值48。我想知道是否有一种方法可以添加字节数据而不会导致溢出?或者这只是汇编的限制?或者我是哑巴?
谢谢你!

oymdgrw7

oymdgrw71#

data db 0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90
result db 0x0

数组包含字节大小的值,因此逻辑上这些值的平均值将适合字节大小的 result 变量,并且您可以使用字节大小的除法(将AX除以元素数)执行计算。
不要使用慢的loop指令!既然你已经在数组中使用了一个偏移量,那么就使用偏移量中的值来控制循环:

xor   ebx, ebx                      ; Offset
  xor   eax, eax                      ; Sum
AW:
  movzx ecx, byte [ds:data + ebx]     ; Load element
  add   eax, ecx
  inc   ebx
  cmp   ebx, 10
  jb    AW

现在执行字节大小的除法。BL寄存器中有一个合适的除法器(10):

div   bl                            ; AX / BL
  mov   [ds:result], al

相关问题