帮忙编写个程序
自编一个程序,要求显示AX的内容,即能显示AX=xxxx。调试时AX的内容可用R命令赋值,也可用MOV指令赋值。
本帖最后由 兰陵月 于 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: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:28
这个程序还没写完,我是准备研究一下16位和32位模式压栈操作下指针变化情况。所以做了这么一个显示的小程序。
其中有涉及到在屏幕上显示寄存器的值,我是用“0x????”的方式显示的。
我这里程序中第148行,就是显示寄存器SP的值,用了一个过程to_Hex。
to_Hex过程在第50~79行。
程序供你参考。 本帖最后由 兰陵月 于 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]