鱼C论坛

 找回密码
 立即注册
查看: 4599|回复: 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 编辑
  1.             ;这是一个显示16位和32位模式下PUSH指令操作情况的程序
  2.             ;程序将显示栈中压入的内容和栈指针的变化情况
  3.             ;PUSHexecute.asm
  4.             ;by 鱼C论坛 ID:兰陵月
  5.             ;2017年11月19日

  6.   ;----------------------程序开始----------------------
  7.              jmp near start

  8.   ;----------------------------------------------------
  9.   ;数据定义区
  10.   info_begin db 'This time,You PUSH operate is ',0
  11.   info_num   db 'the Number is: ',0
  12.   info_size  db 'Size is: ',0
  13.   num_one    db '0x55. ',0
  14.   info_imm   db 'IMME.',0
  15.   info_byte  db 'BYTE.',0
  16.   info_word  db 'WORD.',0
  17.   info_dword db 'DWORD.',0
  18.   seg_add    db 'the Segment Address(SS) is: ',0
  19.   eff_add    db 'the Effective Address(SP) is: ',0
  20.   hex_sign   db '0x',0
  21.   hex_buff   db 0,0,0,0  ;存放十六进制个位数字的ASCII码值
  22.   bxvalue    dw 0


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

  25. show_info:
  26.              mov al,[bx]
  27.              cmp al,0
  28.              jz show_end
  29.              mov [es:di],al
  30.              inc di
  31.              mov [es:di],ah
  32.              inc di
  33.              inc bx
  34.              jmp show_info

  35.   show_end:
  36.              ret

  37.   ;显示信息过程结束
  38.   ;----------------------------------------------------

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

  41.   to_Hex:
  42.             mov si,hex_buff
  43.             mov cx,4
  44.             mov bx,16

  45.       @lp1:
  46.             xor dx,dx
  47.             div bx
  48.             cmp dl,9
  49.             jbe @num
  50.             add dl,0x07
  51.       @num: add dl,0x30
  52.             mov [si],dl

  53.             inc si
  54.             loop @lp1

  55.             dec si
  56.             mov cx,4
  57.       @lp2:
  58.             mov bl,[si]
  59.             mov [es:di],bl
  60.             inc di
  61.             mov bl,0x04
  62.             mov [es:di],bl
  63.             inc di
  64.             dec si
  65.             loop @lp2

  66.             ret
  67.   ;----------------------------------------------------
  68.   ;显示相关信息
  69.     start:


  70.              mov ax,0x7c0
  71.              mov ds,ax

  72.              mov ax,0xb800
  73.              mov es,ax

  74.              xor al,al
  75.              mov di,160

  76.              mov ah,0x07
  77.              mov bx,info_begin
  78.              call show_info

  79.              mov ah,0x04
  80.              mov bx,info_imm
  81.              call show_info

  82.              mov ah,0x07
  83.              mov di,480
  84.              mov bx,info_num
  85.              call show_info

  86.              mov ah,0x04
  87.              mov bx,num_one
  88.              call show_info

  89.              mov ah,0x07
  90.              ;mov di,800
  91.              mov bx,info_size
  92.              call show_info

  93.              mov ah,0x04
  94.              mov bx,info_byte
  95.              call show_info

  96.   ;显示相关信息结束。
  97.   ;----------------------------------------------------

  98.   ;----------------------------------------------------
  99.   ;压栈操作

  100.              mov ax,0x00
  101.              mov ss,ax
  102.              mov sp,0x7fff

  103.              mov ah,0x07
  104.              mov di,800
  105.              mov bx,seg_add
  106.              call show_info
  107.              mov ah,0x04
  108.              mov bx,hex_sign
  109.              call show_info
  110.              mov ax,ss
  111.              call to_Hex

  112.              mov ah,0x07
  113.              mov di,1120
  114.              mov bx,eff_add
  115.              call show_info
  116.              mov ah,0x04
  117.              mov bx,hex_sign
  118.              call show_info
  119.              mov ax,sp
  120.              call to_Hex

  121.              push 0x55

  122.              jmp $

  123.              times 510-($-$) db 0
  124.                               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寄存器(即用其他寄存器来替代这三个寄存器),
即可用来完成你题目想达到的意图。同样的,要显示其他寄存器的内容只需要修改入口参数。

  1.             ;这是一个显示16位模式下PUSH指令操作情况的程序
  2.             ;程序将显示栈中压入不同长度立即数后,栈指针的变化情况
  3.             ;PUSHexecute.asm
  4.             ;by 鱼C论坛 ID:兰陵月
  5.             ;2017年11月19日

  6.   ;----------------------程序开始----------------------
  7.              jmp near start

  8.   ;----------------------------------------------------
  9.   ;数据定义区
  10.   info_begin db 'PUSH Operation: ',0
  11.   info_num   db 'Number: ',0
  12.   info_size  db 'Size: ',0
  13.   num_one    db '0x55. ',0
  14.   info_imm   db 'IMME',0
  15.   info_byte  db 'BYTE',0
  16.   ;info_word  db 'WORD',0
  17.   ;info_dword db 'DWORD',0
  18.   seg_add    db '         Current SS: ',0
  19.   eff_add    db '         Current SP: ',0
  20.   hex_sign   db '0x',0
  21.   num1_push   db "Push 0x55.       SP: ",0
  22.   num2_push   db "Push byte 0x55.  SP: ",0
  23.   num3_push   db "Push word 0x55.  SP: ",0
  24.   num4_push   db "push dword 0x55. SP: ",0
  25.   hex_buff   db 0,0,0,0  ;存放十六进制个位数字的ASCII码值

  26. ;----------------------------------------------------
  27. ;显示带'0'结束标志信息过程
  28. ;入口参数,寄存器bx-存放要显示信息的首地址
  29. ;入口参数,寄存器ah-要显示的字符的颜色。
  30. show_info:
  31.              mov al,[bx]
  32.              cmp al,0
  33.              jz show_end
  34.              mov [es:di],al
  35.              inc di
  36.              mov [es:di],ah
  37.              inc di
  38.              inc bx
  39.              jmp show_info

  40.   show_end:
  41.              ret

  42.   ;显示信息过程结束
  43.   ;----------------------------------------------------

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

  52.       @lp1:
  53.             xor dx,dx
  54.             div bx
  55.             cmp dl,9
  56.             jbe @num
  57.             add dl,0x07
  58.       @num: add dl,0x30
  59.             mov [si],dl

  60.             inc si
  61.             loop @lp1

  62.             dec si
  63.             mov cx,4
  64.       @lp2:
  65.             mov bl,[si]
  66.             mov [es:di],bl
  67.             inc di
  68.             mov bl,0x04
  69.             mov [es:di],bl
  70.             inc di
  71.             dec si
  72.             loop @lp2

  73.             ret
  74.   ;----------------------------------------------------
  75.   ;显示相关信息
  76.     start:   mov ax,0x7c0
  77.              mov ds,ax

  78.              mov ax,0xb800
  79.              mov es,ax

  80.              xor al,al
  81.              mov di,160

  82.              mov ah,0x07
  83.              mov bx,info_begin
  84.              call show_info

  85.              mov ah,0x04
  86.              mov bx,info_imm
  87.              call show_info

  88.              mov ah,0x07
  89.              mov di,480
  90.              mov bx,info_num
  91.              call show_info

  92.              mov ah,0x04
  93.              mov bx,num_one
  94.              call show_info

  95.              mov ah,0x07
  96.              ;mov di,800
  97.              mov bx,info_size
  98.              call show_info

  99.              mov ah,0x04
  100.              mov bx,info_byte
  101.              call show_info

  102.   ;显示相关信息结束。
  103.   ;----------------------------------------------------

  104.   ;----------------------------------------------------
  105.   ;压栈操作

  106.              mov ax,0x00
  107.              mov ss,ax
  108.              mov sp,0x7fff

  109.              mov ah,0x07
  110.              mov di,800
  111.              mov bx,seg_add
  112.              call show_info
  113.              ;mov ah,0x04
  114.              ;mov bx,hex_sign
  115.              ;call show_info
  116.              mov ax,ss
  117.              call to_Hex

  118.              ;--------------------------
  119.              ;显示未开始push操作前SP值
  120.              mov ah,0x07
  121.              mov di,960
  122.              mov bx,eff_add
  123.              call show_info
  124.              ;mov ah,0x04
  125.              ;mov bx,hex_sign
  126.              ;call show_info
  127.              mov ax,sp
  128.              call to_Hex

  129.              ;--------------------------
  130.              ;push 0x55(无前缀)
  131.              mov ah,0x07
  132.              mov di,1120
  133.              mov bx,num1_push
  134.              call show_info
  135.              push 0x55
  136.              mov ax,sp
  137.              call to_Hex

  138.              ;--------------------------
  139.              ;push byte 0x55(有byte前缀)
  140.              mov ah,0x07
  141.              mov di,1280
  142.              mov bx,num2_push
  143.              call show_info
  144.              push byte 0x55
  145.              mov ax,sp
  146.              call to_Hex

  147.              ;--------------------------
  148.              ;push word 0x55(有word前缀)
  149.              mov ah,0x07
  150.              mov di,1440
  151.              mov bx,num3_push
  152.              call show_info
  153.              push word 0x55
  154.              mov ax,sp
  155.              call to_Hex

  156.              ;--------------------------
  157.              ;push dword 0x55(有dword前缀)
  158.              mov ah,0x07
  159.              mov di,1600
  160.              mov bx,num4_push
  161.              call show_info
  162.              push dword 0x55
  163.              mov ax,sp
  164.              call to_Hex


  165.              jmp $

  166.              times 510-($-$) db 0
  167.                               db 0x55,0xaa
复制代码


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 03:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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