assembly8086 | 一个数组的总和,打印多位数字

我写了一个非常简单的代码在ASM X8086,我面临着一个错误。 如果有人能够帮助我一个简短的解释,我将不胜感激。

IDEAL MODEL small STACK 100h DATASEG ; -------------------------- array db 10h, 04h, 04h, 04h, 04h, 04h, 04h, 04h, 04h, 04h sum db 0 ; -------------------------- CODESEG start: mov ax, @data mov ds, ax ; -------------------------- xor cx, cx mov al, 0 mov bx, offset array StartLoop: cmp cx, 10 jge EndLoop add al, [bx] add [sum],al inc cx inc bx jmp StartLoop EndLoop: mov ah, 09h int 21h ; -------------------------- exit: mov ax, 4c00h int 21h END start 

在你的注释中注意到add的改正被movreplace( 注意:add al,[bx]实际上是mov al,[bx] )只是标签EndLoop的函数调用是错误的!

你想显示总和,并使用DOS打印function。 这个函数09h期望DS:DX中没有提供的指针!
即使你做了,你仍然必须转换文本表示的总和号码。

这里的一个快速解决scheme就是让自己满意,并以单个ASCII字符的forms显示结果。 硬编码的总和是52,所以它是一个可显示的字符:

 EndLoop: mov dl, [sum] mov ah, 02h ;Single character output int 21h ; -------------------------- exit: mov ax, 4c00h int 21h 

更进一步,我们可以显示“52”:

 mov al,[sum] mov ah,0 mov dl,10 div dl ---> AL=5 AH=2 add ax,3030h ---> AL="5" AH="2" mov dh,ah ;preserve AH mov dl,al mov ah,02h int 21h mov dl,dh ;restore int 21h 

我没有看到任何错误,代码将总结数组,显示一些随机sh * t,然后退出。

你可能要显示总和的结果?

int 21h, ah=9将显示由dx指向的内存中'$'终止的string。

所以你需要两件事情,把[sum]的数字转换成以'$'结尾的string,然后把dx设置为int 21h之前的转换后的string。

您可以尝试从这里提取number2string过程: https : number2string

我个人将其改为将si的目标缓冲区的地址作为另一个调用参数(即mov si,offset str仅从程序体中删除mov si,offset str )。 喜欢这个:

 PROC number2string ; arguments: ; ax = unsigned number to convert ; si = pointer to string buffer (must have 6+ bytes) ; modifies: ax, bx, cx, dx, si mov bx, 10 ; radix 10 (decimal number formatting) xor cx, cx ; counter of extracted digits set to zero number2string_divide_by_radix: ; calculate single digit xor dx, dx ; dx = 0 (dx:ax = 32b number to divide) div bx ; divide dx:ax by radix, remainder will be in dx ; store the remainder in stack push dx inc cx ; loop till number is zero test ax, ax jnz number2string_divide_by_radix ; now convert stored digits in stack into string number2string_write_string: pop dx add dl, '0' ; convert 0-9 value into '0'-'9' ASCII character encoding ; store character at end of string mov [si], dl inc si ; loop till all digits are written dec cx jnz number2string_write_string ; store '$' terminator at end mov BYTE PTR [si],'$' ret ENDP 

然后在你的EndLoop调用它,你需要添加到数据段numberStr DB 8 DUP (0) ,为string分配一些内存缓冲区并添加到代码中:

  ; load sum as 16b unsigned value into ax xor ax,ax ; ax = 0 mov al,[sum] ; ax = sum (16b zero extended) ; convert it to string mov si,OFFSET numberStr call number2string ; display the '$' terminated string mov dx,OFFSET numberStr mov ah,9 int 21h ; ... exit ...