- [游客] 求3号,不是1号。 10/25 19:27
- [towersimper] 这就看是CS:IP指向的还是DS:偏移地址指向,若是前者是指令,若是后者是数据。即指令和数据都是二进 10/22 16:57
- [游客] 问一下,我们如何判断e写入的是数据还是指令呢? 10/03 22:43
- [chendeke060482] 告诉大家一个秘密。用我博客里介绍的win-masm v2.2软件,然后用二进制软件打开安装目录下的m 08/05 22:49
- [zkry04] 真的是好东西,及时雨,这几天就是被这些错误困扰,头都搞大了。。。感谢楼主提供这么好的东西。收藏了!! 08/04 20:04
- [masmaster] 嘿嘿~~↖(^ω^)↗ 07/27 16:16
- [towersimper] 呵呵。我当然知道此处程序只能处理65536以下的整数啊。只是姑且按照书上说的那样啊。在第十章设计点中 07/27 15:07
- [masmaster] 找个32位大数测试了吗?例如:ffffffffh 07/27 14:51
- [towersimper] 好的,我试试。谢谢啊。呵呵 07/26 22:08
- [masmaster] 装个VM,试一试呢? 07/24 23:27
[2010-07-27 10:02] 第十章实验十:编写子程序之一数值显示
第十章实验十:编写子程序之一数值显示
assume cs:code,ds:data,ss:stack
data segment
db 10 dup (0)
data ends
stack segment
dw 32 dup (0)
stack ends
code segment
start: mov ax,12666 ;存储需要显示的整数
mov bx,data
mov ds,bx ;将整数转换为字符串后所存储的存储单元的数据段段地址
mov bx,stack
mov ss,bx
mov sp,40h ;以上三条指令设置栈段和空栈
mov si,0
call dtoc ;调用将整数化为字符串的子程序
mov dh,8 ;以下程序及show_str子程序的注释见编写子程序之一字符串显示,里面有详细介绍,这里不作多解释
mov dl,3
mov cl,02h
call show_str
mov ax,4c00h
int 21h
dtoc: push ax ;将与外程序重叠的ax入栈保护
push si ;将与外程序重叠的si入栈保护
mov di,0
s0: mov dx,0
mov cx, 0Ah
div cx ;32为被除数,其中低16位在ax中,高16为在dx中,相除后,商在ax中,余数在dx(余数是在0~9)中
mov cx,ax ;将商传给cx以便jcxz判断商是否为0
add dx,30h ;将余数转换为数字的ascii码
push dx ;将转换后的ascii字符入栈,由于余数在[0~9],可知(dh)为0,即(dx)=(dl)
inc si ;将入栈的数字ascii码个数记录下来,即统计待显示十进制数总共有多少位
jcxz s1 ;如果商为0,跳出s0循环,如果不为0,将继续循环,下次循环,被除数为上次循环的商。
jmp short s0
s1: mov cx,si ;将统计的十进制数位数传给cx,表示出栈的次数
s2: pop dx ;将之前入栈的ascii码按照与入栈相反数序出栈
mov ds:[di],dl ;将每次出栈的ascii码存储到数据段中
inc di ;出栈循环,每循环一次,di加1
loop s2
pop si ;将被的保护si出栈
pop ax ;将被的保护ax出栈
ret ;返回调用dtoc子程序的主程序处
show_str:
push ax
push dx
push cx
push si
mov bx,0B800h
mov es,bx
mov al,0A0h
mul dh
mov bx,ax
mov ah,0
mov al,dl
add bx,ax
mov di,0
mov ch,0
mov al,cl
s3: mov cl,ds:[si]
jcxz ok
mov es:[bx+di+1],cl
mov es:[bx+di+2],al
inc si
add di,2
loop s3
ok: pop si
pop cx
pop dx
pop ax
ret
code ends
end start
assume cs:code,ds:data,ss:stack
data segment
db 10 dup (0)
data ends
stack segment
dw 32 dup (0)
stack ends
code segment
start: mov ax,12666 ;存储需要显示的整数
mov bx,data
mov ds,bx ;将整数转换为字符串后所存储的存储单元的数据段段地址
mov bx,stack
mov ss,bx
mov sp,40h ;以上三条指令设置栈段和空栈
mov si,0
call dtoc ;调用将整数化为字符串的子程序
mov dh,8 ;以下程序及show_str子程序的注释见编写子程序之一字符串显示,里面有详细介绍,这里不作多解释
mov dl,3
mov cl,02h
call show_str
mov ax,4c00h
int 21h
dtoc: push ax ;将与外程序重叠的ax入栈保护
push si ;将与外程序重叠的si入栈保护
mov di,0
s0: mov dx,0
mov cx, 0Ah
div cx ;32为被除数,其中低16位在ax中,高16为在dx中,相除后,商在ax中,余数在dx(余数是在0~9)中
mov cx,ax ;将商传给cx以便jcxz判断商是否为0
add dx,30h ;将余数转换为数字的ascii码
push dx ;将转换后的ascii字符入栈,由于余数在[0~9],可知(dh)为0,即(dx)=(dl)
inc si ;将入栈的数字ascii码个数记录下来,即统计待显示十进制数总共有多少位
jcxz s1 ;如果商为0,跳出s0循环,如果不为0,将继续循环,下次循环,被除数为上次循环的商。
jmp short s0
s1: mov cx,si ;将统计的十进制数位数传给cx,表示出栈的次数
s2: pop dx ;将之前入栈的ascii码按照与入栈相反数序出栈
mov ds:[di],dl ;将每次出栈的ascii码存储到数据段中
inc di ;出栈循环,每循环一次,di加1
loop s2
pop si ;将被的保护si出栈
pop ax ;将被的保护ax出栈
ret ;返回调用dtoc子程序的主程序处
show_str:
push ax
push dx
push cx
push si
mov bx,0B800h
mov es,bx
mov al,0A0h
mul dh
mov bx,ax
mov ah,0
mov al,dl
add bx,ax
mov di,0
mov ch,0
mov al,cl
s3: mov cl,ds:[si]
jcxz ok
mov es:[bx+di+1],cl
mov es:[bx+di+2],al
inc si
add di,2
loop s3
ok: pop si
pop cx
pop dx
pop ax
ret
code ends
end start
评论次数(3) |
浏览次数(715) |
类型(汇编作业) |
收藏此文 |
[ masmaster 发表于 2010-07-27 14:51 ]
找个32位大数测试了吗?例如:ffffffffh
[ towersimper 发表于 2010-07-27 15:07 ]
呵呵。我当然知道此处程序只能处理65536以下的整数啊。只是姑且按照书上说的那样啊。在第十章设计点中要把实验七的数据显示时,要涉及到一些用16位寄存器ax不能存储的dd型数据,当然要改一下程序了。老兄莫急啊。还在继续做题目啊。
[ masmaster 发表于 2010-07-27 16:16 ]
嘿嘿~~↖(^ω^)↗