装配程序添加两个32位数字并在屏幕上显示结果

时间:2014-04-23 18:10:47

标签: assembly x86-16

所以这是所提到程序的汇编代码:

.model small
.386p
.data
    n1 dd 12345678h
    n2 dd 11112222h
    res dd ?
.code
.startup
    mov eax, n1
    mov ebx, n2
    add eax, ebx
    mov res,eax
    call disp

    disp proc near
    mov ch,08h
up:
    mov eax,res
    rol eax, 04h
    mov res,eax
    and al, 0Fh
    cmp al, 0Ah
    JC d1
    add al,07h
    d1: add al,30h

    mov dl, al

    mov ah, 02h
    int 21h
    dec ch
    JNZ up

    ret
    endp disp
    mov ah,4ch
    int 21h

end
.exit

有人会善意地解释“disp”程序究竟是一步一步的吗?添加部分是有道理的,尽管其他部分让我不知所措。谢谢!

2 个答案:

答案 0 :(得分:1)

首先它将res中的32位值旋转,以便前4个最高有效位最终位于4个最低有效位中:

mov eax,res
rol eax, 04h
mov res,eax

例如,如果res在第一行持有0x12345678eaxres都会在第三行后保留0x23456781

然后屏蔽除al的最低有效位之外的所有位:

and al, 0Fh

如果我们继续上面的示例,al现在将包含0x01

如果alal >= 0x0A可以被视为JC),则会向Jump if unsigned less than添加7,最后将'0'(0x30)添加到{{ 1}}:

al

如果cmp al, 0Ah JC d1 add al,07h d1: add al,30h 最初在0..9范围内,它现在将在0x30..0x39(ASCII al)范围内。如果它最初在0x0A..0x0F范围内,它现在将在0x41..0x46范围内(ASCII '0'..'9')。

最后,它使用'A'..'F'int 21h / ah=02h)打印生成的字符。

然后再重复7次(即对于32位输入数字中的每个十六进制数字)。

答案 1 :(得分:0)

首先:序列

mov ah,4ch
int 21h

(退出程序)位置错误。它必须在disp proc near之前。

过程disp以十六进制表示法显示res中的无符号整数:

disp proc near
    mov ch,08h          ; loop 8 times 'up'
up:
    mov eax,res         ; load value in 'result'
    rol eax, 04h        ; move the highest nibble to the lowest place
    mov res,eax         ; save eax for future use (next pass of 'up')
    and al, 0Fh         ; isolate the nibble
    cmp al, 0Ah         ; al < 0A?
    JC d1               ; yes: skip the next command
    add al,07h          ; add 7 to match the appropriate character ('A' - 'F')
    d1: add al,30h      ; convert AL to ASCII
    mov dl, al
    mov ah, 02h         ; Fn 02h: Write character in DL to Standard Output (Stdout)
    int 21h             ; call MSDOS-interrupt
    dec ch              ; loop 8 times
    JNZ up
    ret
endp disp               ; TASM. For MASM use 'disp endp'