回 帖 发 新 帖 刷新版面

主题:又找到一个程序,一步一步的读

从键盘接收一个4位的16进制数,并在终端上显示与它等值的2进制数

data    segment
    buf db 4,?
    ascstg db 10 dup(?)
    integer dw 0
    promt db 'Input hexadecimal(4):$'
    dsperr db 0dh,0ah,'error!no hexadecimal!$'
data    ends
code    segment use16
    assume cs:code,ds:data
start:    mov ax,data
    mov ds,ax
    mov dx,offset promt
    mov ah,09h
    int 21h
    mov dx,offset buf
    mov ah,oah
    int 21h
    mov cl,4
    lea si,ascstg
    mov al,[si]
    cld
    xor dx,dx
    mov bl,0
    mov ch,buf[1]
    cmp ch,0
    jz exit
    cmp al,'+'
    jnz next
    inc si
    dec ch
    jmp conv
next:    cmp al,'-'
    jnz conv
    inc si
    dec ch
    mov bl,0ffh
conv:    cmp ch,0c
    jz store
    lodsb
    cmp al,'0'
    jb error
    cmp al,'9'
    ja next1
    sub al,30h
    jmp short rotate
next1:    call a_to_f
    jc error
rotate:    shl dx,cl
    or dl,al
    dec ch
    jmp short conv
store:    cmp ,bl,0
    jz lp
    neg dx
lp:    mov integer,dx
exit:    mov dx,offset dsperr
    mov ah,09h
    int 21h
    jmp exit
a_to_f    proc
    cmp al,'a'
    jb nohex
    cmp al,'f'
    ja next2
    sub al,37h
    jmp hex
next2:    cmp al,'a'
    jb nohex
    cmp al,'f'
    ja nohex
    sub al,547h
hex:    clc
    ret
nohex:    stc
    ret
a_to_f    endp
code    ends
    end start

回复列表 (共12个回复)

沙发

程序有好多地方看不懂  只能一步一步的读   不懂的就请教大家

mov dx,offset promt
    mov ah,09h
    int 21h
  这是09调用吧(以前在论坛问过这个  所以知道)   上面3句话的作用是不是将 promt的偏移地址在屏幕上面显示出来? 

    mov dx,offset buf
    mov ah,oah
    int 21h
这3句又是什么意思呢(估计是什么oa调用,是吗?  有什么作用)

板凳


呵呵,你得签名好有个性啊,我正在学习中,等半个月后我再看这道题,也许会了

3 楼

a za a za fighting

4 楼

这个啥意思呀,看不懂唉。。。

5 楼

第一个是你说的那样.
 第二个就是叫你输入,放入buf中.个人认为这个比较有用,应该好好了解一下.

6 楼


buf db 4,?  这个定义什么怎么定义的 是不是   先定义了一个4 然后下一个存储单元是空的,是为buf预留一个存储单元   是这样的吗


这里为什么要先定义一个4?  有什么用?

7 楼

这程序问题相当多
举几个大家讨论下:
lea si,ascstg
mov al,[si]
这里ascstg都还没被赋值

exit:    mov dx,offset dsperr
    mov ah,09h
    int 21h
    jmp exit
这个似乎是个死循环

8 楼

ascstg db 10 dup(?)
这个就是 定义预留10个存储单元给ascstg吧 是不是已经固定是哪10个存储单元预留给ascstg   难道不算已经赋值了?

9 楼

[quote]程序有好多地方看不懂  只能一步一步的读   不懂的就请教大家

mov dx,offset promt
    mov ah,09h
    int 21h
  这是09调用吧(以前在论坛问过这个  所以知道)   上面3句话的作用是不是将 promt的偏移地址在屏幕上面显示出来?[/quote] 

当然不是!是把“从promt的偏移地址开始的字符串在屏幕上面显示出来”
[quote]

    mov dx,offset buf
    mov ah,oah
    int 21h
这3句又是什么意思呢(估计是什么oa调用,是吗?  有什么作用)[/quote]

从键盘读入字符,在屏幕显示,并送入buf;buf的首字节为buf的长度-2,
次字节为实际接收的字符数

10 楼

有几个错误
    sub al,547h     ;= =;
    jb error        ;error 在哪里?
    mov ah,oah      ;应该是这个吧 0ah

我来回复

您尚未登录,请登录后再回复。点此登录或注册