鱼C论坛

 找回密码
 立即注册
查看: 5072|回复: 4

帮忙编写个程序

[复制链接]
发表于 2017-11-19 10:13:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
自编一个程序,要求显示AX的内容,即能显示AX=xxxx。
调试时AX的内容可用R命令赋值,也可用MOV指令赋值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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,必定除完。

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

这样就可以了。



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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_size  db 'Size is: ',0
  num_one    db '0x55. ',0
  info_imm   db 'IMME.',0
  info_byte  db 'BYTE.',0
  info_word  db '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,[bx]
             cmp al,0
             jz show_end
             mov [es:di],al
             inc di
             mov [es:di],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 [si],dl

            inc si
            loop @lp1

            dec si
            mov cx,4
      @lp2:
            mov bl,[si]
            mov [es:di],bl
            inc di
            mov bl,0x04
            mov [es:di],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


程序运行结果:
000.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-19 20:32:53 | 显示全部楼层

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

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

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

to_Hex过程在第50~79行。

程序供你参考。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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_size  db 'Size: ',0
  num_one    db '0x55. ',0
  info_imm   db 'IMME',0
  info_byte  db 'BYTE',0
  ;info_word  db '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,[bx]
             cmp al,0
             jz show_end
             mov [es:di],al
             inc di
             mov [es:di],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 [si],dl

            inc si
            loop @lp1

            dec si
            mov cx,4
      @lp2:
            mov bl,[si]
            mov [es:di],bl
            inc di
            mov bl,0x04
            mov [es:di],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

程序运行结果。
000.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 06:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表