大家晚上好,我面临的问题是尝试将所有字节定义的值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。我想知道是否有一种方法可以添加字节数据而不会导致溢出?或者这只是汇编的限制?或者我是哑巴?
谢谢你!
1条答案
按热度按时间oymdgrw71#
数组包含字节大小的值,因此逻辑上这些值的平均值将适合字节大小的 result 变量,并且您可以使用字节大小的除法(将AX除以元素数)执行计算。
不要使用慢的
loop
指令!既然你已经在数组中使用了一个偏移量,那么就使用偏移量中的值来控制循环:现在执行字节大小的除法。BL寄存器中有一个合适的除法器(10):