Assembly 计算数字的平方,并将其存储在8086 masm组件的dw中

Assembly 计算数字的平方,并将其存储在8086 masm组件的dw中,assembly,dos,x86-16,Assembly,Dos,X86 16,我试图用蛮力计算5的平方,所以我尝试了这个,但它没有在dw中存储任何东西,我定义了dw,就像这个结果dw 2 dup一样 计算5的平方 5^2=25,但您的代码生成30 您的循环总共进行了5次添加,在故障排除中增加1次,在跳回中增加4次。 因为AX是从它的原始值开始的,所以你得到的太多了 从零开始AX或少进行1次迭代: mov ax, 5 mov bx, 5 mov cx, 1 mov dx, ax XOR AX, AX ; start at zero loop1: add ax

我试图用蛮力计算5的平方,所以我尝试了这个,但它没有在dw中存储任何东西,我定义了dw,就像这个结果dw 2 dup一样

计算5的平方

5^2=25,但您的代码生成30 您的循环总共进行了5次添加,在故障排除中增加1次,在跳回中增加4次。 因为AX是从它的原始值开始的,所以你得到的太多了

从零开始AX或少进行1次迭代:

 mov ax, 5
 mov bx, 5
 mov cx, 1
 mov dx, ax
 XOR AX, AX   ; start at zero
loop1:
 add ax, dx

 cmp bx, cx
 je endLoop

 add cx, 1
 jmp loop1
-

它不在dw中存储任何内容,我定义了dw,就像这个结果dw 2 dup一样

请确保使用如下代码设置DS:

mov ax, data    ; maybe you'll need 'mov ax, @data'
mov ds, ax
尝试使用方括号替代内存寻址:

mov [result], ax
评论如下:

我试图像这样检索结果 莉丝,结果如何 国际公司 mov-dl[si] mov啊,2h int 21h

为什么要获取结果的第二个字节?这很可能是零。 此外,结果有2个数字,因此需要输出2个字符

这是我最近回答的另一个问题的解决方案:

mov ax, [result]     ; AX=25
mov bl, 10
div bl               ; AL=2   AH=5
add ax, "00"         ; AL='2' AH='5'
mov dx, ax
mov ah, 02h
int 21h              ; Outputs the character in DL='2'
mov dl, dh
mov ah, 02h
int 21h              ; Outputs the character in DL='5'

对我来说是有效的,所以你不需要展示代码其余部分的其他重要部分,如何组装它,如何运行它,以及如何检查内存中包含的内容,用关键信息查看并改进你的问题。很可能您没有将ds设置为指向结果中保留内存的正确段,或者您只是查看了错误的内存区域debugger@Ped7g所以我的数据段包含这个数据段结果dw 2 dup data ends,我试图检索这样的结果lea si,result inc si mov dl,[si]mov ah,2h int 21hIf如果要生成EXE文件,则必须设置ds寄存器以指向数据段。mov[result],ax确实隐式使用ds:result地址,除非通过显式段前缀(如mov es:[result],ax)覆盖它,否则必须正确设置es。重新阅读你的书/教程,看看它在哪里提到ds的设置,以及它建议如何做。还有内存分段是如何在8086的16位实数模式下工作的,您正在检索结果的零字节,然后输出它,这可能在屏幕上不会产生任何结果。。。dw 2 dup确实保留了四个字节的内存/mov结果,ax将写入两个字节25和0=16位25整数,而您的检索代码将命中16b整数的0字节高8位。。。顺便说一句,通过您的问题和这些细节,很明显您没有使用调试器来查看每个指令,正在发生什么。。。你这样做是在浪费大家的时间,找一些调试器并学习使用它,这对于ASM编程来说是至关重要的。同样要在屏幕上输出25个字符,你必须写两个字符“2”和“5”。BIOS和DOS服务没有任何打印整数服务,所以你可以去查看多位数段落中的16b代码,这周你只会像第四个人一样问同样的问题最烦人的部分是,你设法在问题中发布了所有关于你代码的正确信息,并且隐藏所有关于你的代码和你如何操作的错误,这就是为什么你应该在下一次发布适当的感谢你!我认为问题在于我不知道如何正确输出。它被储存起来了。
mov [result], ax
mov ax, [result]     ; AX=25
mov bl, 10
div bl               ; AL=2   AH=5
add ax, "00"         ; AL='2' AH='5'
mov dx, ax
mov ah, 02h
int 21h              ; Outputs the character in DL='2'
mov dl, dh
mov ah, 02h
int 21h              ; Outputs the character in DL='5'