巅峰王座 发表于 2017-11-19 10:13:24

帮忙编写个程序

自编一个程序,要求显示AX的内容,即能显示AX=xxxx。
调试时AX的内容可用R命令赋值,也可用MOV指令赋值。

兰陵月 发表于 2017-11-19 20:09:13

本帖最后由 兰陵月 于 2017-11-19 20:14 编辑

1、debug调试的时候本来就能够使用R命令查看寄存器的内容,它会直接显示在调试中相应位置,不需要编制一个什么自己的程序。

2、自编一个程序,要求显示AX的内容,意思就是在屏幕上显示AX数值的十六进制ASCII码。
思路:
DX清零,用DX:AX作为被除数,除以F
得到的余数在DL中,
比较DL的值,
如果DL小于等于9,则将该值加上0x30,变成ASCII码值,存放在某个位置
如果DL大于9,则将该值加上0x37,变成大写ASCII码值,存放在某个位置
循环4次,因为AX最大只有FFFF,因此除以4次F,必定除完。

再按从左到右顺序,依次取出,显示在屏幕上。

这样就可以了。



兰陵月 发表于 2017-11-19 20:28:42

本帖最后由 兰陵月 于 2017-11-19 20:38 编辑

            ;这是一个显示16位和32位模式下PUSH指令操作情况的程序
            ;程序将显示栈中压入的内容和栈指针的变化情况
            ;PUSHexecute.asm
            ;by 鱼C论坛 ID:兰陵月
            ;2017年11月19日

;----------------------程序开始----------------------
             jmp near start

;----------------------------------------------------
;数据定义区
info_begin db 'This time,You PUSH operate is ',0
info_num   db 'the Number is: ',0
info_sizedb 'Size is: ',0
num_one    db '0x55. ',0
info_imm   db 'IMME.',0
info_bytedb 'BYTE.',0
info_worddb 'WORD.',0
info_dword db 'DWORD.',0
seg_add    db 'the Segment Address(SS) is: ',0
eff_add    db 'the Effective Address(SP) is: ',0
hex_sign   db '0x',0
hex_buff   db 0,0,0,0;存放十六进制个位数字的ASCII码值
bxvalue    dw 0


;----------------------------------------------------
;显示带'0'结束标志信息过程

show_info:
             mov al,
             cmp al,0
             jz show_end
             mov ,al
             inc di
             mov ,ah
             inc di
             inc bx
             jmp show_info

show_end:
             ret

;显示信息过程结束
;----------------------------------------------------

;----------------------------------------------------
;转换到十六进制数字,并显示

to_Hex:
            mov si,hex_buff
            mov cx,4
            mov bx,16

      @lp1:
            xor dx,dx
            div bx
            cmp dl,9
            jbe @num
            add dl,0x07
      @num: add dl,0x30
            mov ,dl

            inc si
            loop @lp1

            dec si
            mov cx,4
      @lp2:
            mov bl,
            mov ,bl
            inc di
            mov bl,0x04
            mov ,bl
            inc di
            dec si
            loop @lp2

            ret
;----------------------------------------------------
;显示相关信息
    start:


             mov ax,0x7c0
             mov ds,ax

             mov ax,0xb800
             mov es,ax

             xor al,al
             mov di,160

             mov ah,0x07
             mov bx,info_begin
             call show_info

             mov ah,0x04
             mov bx,info_imm
             call show_info

             mov ah,0x07
             mov di,480
             mov bx,info_num
             call show_info

             mov ah,0x04
             mov bx,num_one
             call show_info

             mov ah,0x07
             ;mov di,800
             mov bx,info_size
             call show_info

             mov ah,0x04
             mov bx,info_byte
             call show_info

;显示相关信息结束。
;----------------------------------------------------

;----------------------------------------------------
;压栈操作

             mov ax,0x00
             mov ss,ax
             mov sp,0x7fff

             mov ah,0x07
             mov di,800
             mov bx,seg_add
             call show_info
             mov ah,0x04
             mov bx,hex_sign
             call show_info
             mov ax,ss
             call to_Hex

             mov ah,0x07
             mov di,1120
             mov bx,eff_add
             call show_info
             mov ah,0x04
             mov bx,hex_sign
             call show_info
             mov ax,sp
             call to_Hex

             push 0x55

             jmp $

             times 510-($-$) db 0
                              db 0x55,0xaa


程序运行结果:

兰陵月 发表于 2017-11-19 20:32:53

兰陵月 发表于 2017-11-19 20:28


这个程序还没写完,我是准备研究一下16位和32位模式压栈操作下指针变化情况。所以做了这么一个显示的小程序。

其中有涉及到在屏幕上显示寄存器的值,我是用“0x????”的方式显示的。

我这里程序中第148行,就是显示寄存器SP的值,用了一个过程to_Hex。

to_Hex过程在第50~79行。

程序供你参考。

兰陵月 发表于 2017-11-20 11:26:18

本帖最后由 兰陵月 于 2017-11-20 11:28 编辑

下面是我修改后,编写完成的程序。
因为考虑到尽量少影响SP,保证栈指针操作的准确性,这个程序没有考虑优化问题。
程序中to_Hex过程为显示SP寄存器的内容,入口参数为寄存器。
你只需要把SP寄存器变成AX寄存器,
然后相应修改一下to_Hex过程中用到的AX、AH、AL寄存器(即用其他寄存器来替代这三个寄存器),
即可用来完成你题目想达到的意图。同样的,要显示其他寄存器的内容只需要修改入口参数。
            ;这是一个显示16位模式下PUSH指令操作情况的程序
            ;程序将显示栈中压入不同长度立即数后,栈指针的变化情况
            ;PUSHexecute.asm
            ;by 鱼C论坛 ID:兰陵月
            ;2017年11月19日

;----------------------程序开始----------------------
             jmp near start

;----------------------------------------------------
;数据定义区
info_begin db 'PUSH Operation: ',0
info_num   db 'Number: ',0
info_sizedb 'Size: ',0
num_one    db '0x55. ',0
info_imm   db 'IMME',0
info_bytedb 'BYTE',0
;info_worddb 'WORD',0
;info_dword db 'DWORD',0
seg_add    db '         Current SS: ',0
eff_add    db '         Current SP: ',0
hex_sign   db '0x',0
num1_push   db "Push 0x55.       SP: ",0
num2_push   db "Push byte 0x55.SP: ",0
num3_push   db "Push word 0x55.SP: ",0
num4_push   db "push dword 0x55. SP: ",0
hex_buff   db 0,0,0,0;存放十六进制个位数字的ASCII码值

;----------------------------------------------------
;显示带'0'结束标志信息过程
;入口参数,寄存器bx-存放要显示信息的首地址
;入口参数,寄存器ah-要显示的字符的颜色。
show_info:
             mov al,
             cmp al,0
             jz show_end
             mov ,al
             inc di
             mov ,ah
             inc di
             inc bx
             jmp show_info

show_end:
             ret

;显示信息过程结束
;----------------------------------------------------

;----------------------------------------------------
;转换到十六进制数字,并显示
;入口参数,寄存器AX-要显示的寄存器的内容
;入口参数,hex_buff,存放每个位数值的缓冲区首地址
to_Hex:
            mov si,hex_buff
            mov cx,4
            mov bx,16

      @lp1:
            xor dx,dx
            div bx
            cmp dl,9
            jbe @num
            add dl,0x07
      @num: add dl,0x30
            mov ,dl

            inc si
            loop @lp1

            dec si
            mov cx,4
      @lp2:
            mov bl,
            mov ,bl
            inc di
            mov bl,0x04
            mov ,bl
            inc di
            dec si
            loop @lp2

            ret
;----------------------------------------------------
;显示相关信息
    start:   mov ax,0x7c0
             mov ds,ax

             mov ax,0xb800
             mov es,ax

             xor al,al
             mov di,160

             mov ah,0x07
             mov bx,info_begin
             call show_info

             mov ah,0x04
             mov bx,info_imm
             call show_info

             mov ah,0x07
             mov di,480
             mov bx,info_num
             call show_info

             mov ah,0x04
             mov bx,num_one
             call show_info

             mov ah,0x07
             ;mov di,800
             mov bx,info_size
             call show_info

             mov ah,0x04
             mov bx,info_byte
             call show_info

;显示相关信息结束。
;----------------------------------------------------

;----------------------------------------------------
;压栈操作

             mov ax,0x00
             mov ss,ax
             mov sp,0x7fff

             mov ah,0x07
             mov di,800
             mov bx,seg_add
             call show_info
             ;mov ah,0x04
             ;mov bx,hex_sign
             ;call show_info
             mov ax,ss
             call to_Hex

             ;--------------------------
             ;显示未开始push操作前SP值
             mov ah,0x07
             mov di,960
             mov bx,eff_add
             call show_info
             ;mov ah,0x04
             ;mov bx,hex_sign
             ;call show_info
             mov ax,sp
             call to_Hex

             ;--------------------------
             ;push 0x55(无前缀)
             mov ah,0x07
             mov di,1120
             mov bx,num1_push
             call show_info
             push 0x55
             mov ax,sp
             call to_Hex

             ;--------------------------
             ;push byte 0x55(有byte前缀)
             mov ah,0x07
             mov di,1280
             mov bx,num2_push
             call show_info
             push byte 0x55
             mov ax,sp
             call to_Hex

             ;--------------------------
             ;push word 0x55(有word前缀)
             mov ah,0x07
             mov di,1440
             mov bx,num3_push
             call show_info
             push word 0x55
             mov ax,sp
             call to_Hex

             ;--------------------------
             ;push dword 0x55(有dword前缀)
             mov ah,0x07
             mov di,1600
             mov bx,num4_push
             call show_info
             push dword 0x55
             mov ax,sp
             call to_Hex


             jmp $

             times 510-($-$) db 0
                              db 0x55,0xaa

程序运行结果。

页: [1]
查看完整版本: 帮忙编写个程序