这个程序比较简单,需要注意的一点是:a-z对应的ACXII码的范围为[61H-7aH](该区间为闭区间),而不是(61H-7aH)(该区间为开区间)
assume cs:code
data segment
db "Beginner's All-puposer Symbolic Instruction Code.",0
data ends
stack segment
dw 8 dup (0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov ...
[2009-06-02 19:36] 王爽<<汇编语言>>实验11
阅读全文 |
评论次数(1) |
浏览次数(390) |
所属类型(默认类型)
[2009-05-29 20:41] 对子程序一的思考
看了hanlsheng写的子程序一show_str,对比一下自己写的.区别在什么地方哪
首先指出一个不足之处:我编写的子程序未对子程序中所有用到的寄存器中的内容保存起来,这可能造成寄存器冲突.
其次是对于字符属性的处理:由于存放字符属性的属性的寄存器cx在接下来的程序被用到,故我将字符属性放到了栈中,而hanlsheng将字符属性保存到了另外一个寄存器中,我觉得这种做法比较好,要是将字符属性放到栈中,这样就限制了对栈的操作(因为下面还要将字符属性取出,在取出之前,所有处于字符属性之前的数据也要被取出)
最后,在确定要读取数据偏移地址上也有一点小小的区别
我觉得还是han...
首先指出一个不足之处:我编写的子程序未对子程序中所有用到的寄存器中的内容保存起来,这可能造成寄存器冲突.
其次是对于字符属性的处理:由于存放字符属性的属性的寄存器cx在接下来的程序被用到,故我将字符属性放到了栈中,而hanlsheng将字符属性保存到了另外一个寄存器中,我觉得这种做法比较好,要是将字符属性放到栈中,这样就限制了对栈的操作(因为下面还要将字符属性取出,在取出之前,所有处于字符属性之前的数据也要被取出)
最后,在确定要读取数据偏移地址上也有一点小小的区别
我觉得还是han...
阅读全文 |
评论次数(0) |
浏览次数(313) |
所属类型(默认类型)
[2009-05-29 18:31] 程序设计一之后的思考
刚刚写好三个子程序,感觉还可以.
看了看程序设计一,觉得应该能很轻松拿下,但一调用show_str这个子程序就出现了问题.
对于程序设计一,仍然采用"王爽<<汇编语言>>实验7"这个程序先将数据正确的输入到TABLE表中,然后调用子程序将TABLE表中相应的数据显示在屏幕上
我是这么想的:先输出年份,年份输出完了后,依次为收入,人数及人均收入.由于年份在预先定义的时候已定义为字符串,故可以将其直接输出到屏幕上,由于对每年的输出都需要调用一次show_str,而共有21个年份,所以作21次循环就可以了.
但是问题就在show_str身上,原先写这个子程序时,是按照题意...
看了看程序设计一,觉得应该能很轻松拿下,但一调用show_str这个子程序就出现了问题.
对于程序设计一,仍然采用"王爽<<汇编语言>>实验7"这个程序先将数据正确的输入到TABLE表中,然后调用子程序将TABLE表中相应的数据显示在屏幕上
我是这么想的:先输出年份,年份输出完了后,依次为收入,人数及人均收入.由于年份在预先定义的时候已定义为字符串,故可以将其直接输出到屏幕上,由于对每年的输出都需要调用一次show_str,而共有21个年份,所以作21次循环就可以了.
但是问题就在show_str身上,原先写这个子程序时,是按照题意...
阅读全文 |
评论次数(0) |
浏览次数(318) |
所属类型(默认类型)
[2009-05-29 09:55] 王爽<<汇编语言>>实验10 之子程序三
子程序三如下:
dtoc: mov cx,10 ;除数为10,
call divdw ;调用divdw,用于分离数据的各个位
push cx ;将分离出的位送入栈中
mov cx,dx ;判断dx中的值是否为0,若不为0,则商不为0
jcxz s1 ;程序顺序被执行,若为0程序跳转到标号s1处
;执行,判断ax中的值是否为0,若不为0,则商
;不为0
pop cx ;...
dtoc: mov cx,10 ;除数为10,
call divdw ;调用divdw,用于分离数据的各个位
push cx ;将分离出的位送入栈中
mov cx,dx ;判断dx中的值是否为0,若不为0,则商不为0
jcxz s1 ;程序顺序被执行,若为0程序跳转到标号s1处
;执行,判断ax中的值是否为0,若不为0,则商
;不为0
pop cx ;...
阅读全文 |
评论次数(0) |
浏览次数(345) |
所属类型(默认类型)
[2009-05-28 08:12] 王爽<<汇编语言>>实验10 之子程序二
由公式X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N(H为X的高十六位)(L为X的低十六位)可知:
int(H/N)*65536 为X/N的结果的高十六位
[rem(H/N)*65536+L]/N 为X/N的结果的低十六位及余数
如何实现int(H/N)*65536
H/N 为十六位除法
故可通过下面的程序段实现(被除数为H即X的高十六位)
push ax ;将ax中的值保存起来,其作用在下个程序段中说明
mov ax,dx
mov dx,0 ;dx与ax分别存储H的高十六位与低十六位
div cx ...
int(H/N)*65536 为X/N的结果的高十六位
[rem(H/N)*65536+L]/N 为X/N的结果的低十六位及余数
如何实现int(H/N)*65536
H/N 为十六位除法
故可通过下面的程序段实现(被除数为H即X的高十六位)
push ax ;将ax中的值保存起来,其作用在下个程序段中说明
mov ax,dx
mov dx,0 ;dx与ax分别存储H的高十六位与低十六位
div cx ...
阅读全文 |
评论次数(0) |
浏览次数(332) |
所属类型(默认类型)
[2009-05-27 18:14] 王爽<<汇编语言>>实验10 之子程序一
第一次写的子程序,注意push cx放到了循环之外,此时的问题是:第一次循环正常,但跟踪执行第二次循环时发现字符的属性输出不正确,这是为什么哪:这是由于 pop cx 将栈顶元素(即push cx,字符的属性)送入cx后,下一个内存单元的数据成为新的栈顶元素(即push si,si中的值)第二次循环时没有将cx中的值重新放入栈中,导致此次执行 pop cx 时送入cx中的值为si中的值。故属性输出不正确
show_str: mov ax,0b800H ;字符在内存中的段地址
mov es,ax
push si
...
show_str: mov ax,0b800H ;字符在内存中的段地址
mov es,ax
push si
...
阅读全文 |
评论次数(0) |
浏览次数(327) |
所属类型(默认类型)
[2009-05-26 16:13] 王爽<<汇编语言>>实验9
在80*25彩色模式下,显示器可显示25行(0-24行)每行有80个字符,每个字符占两个字节(也就是说每行有160个字节)分别存放字符ASCII码和属性。
要在屏幕中间分别显示绿色,绿底红色,白底蓝色的字串 'welcome to masm!'则绿色(02H),绿底红色(24H),白底蓝色(71H)的字符串分别对应屏幕的第11,12,13行,每行行首对应的偏移地址为6e0H,780H,820H.第一个字符w在内存中对应的偏移为64(40H)
,故其偏移地址为6e0H+40H
确定了字符串在内存中的地址,接下来就是如何将字符串输入到相应的内存单元中
这里有两种方法:
1:先将字符输入到...
要在屏幕中间分别显示绿色,绿底红色,白底蓝色的字串 'welcome to masm!'则绿色(02H),绿底红色(24H),白底蓝色(71H)的字符串分别对应屏幕的第11,12,13行,每行行首对应的偏移地址为6e0H,780H,820H.第一个字符w在内存中对应的偏移为64(40H)
,故其偏移地址为6e0H+40H
确定了字符串在内存中的地址,接下来就是如何将字符串输入到相应的内存单元中
这里有两种方法:
1:先将字符输入到...
阅读全文 |
评论次数(0) |
浏览次数(322) |
所属类型(默认类型)
[2009-05-25 14:24] 王爽<<汇编语言>>实验7
我们知道,对于字符,在内存中存放的是与其对应的ASCII码值.如对于
'1975',内存中存放的并不是1975本身,而是与字符'1','9','7',
'5'分别对应的ASCII码31,39,37,35,每个字符占一个字节.而对于
数据如0010H,在内存中存放的为其本身.
用-d 命令可查看某段内存中的内容.如-d 3000:0 这里显示了三部分
内容:
左边:每行行首内存单元的地址
中间:相应内存单元存放的数据
右边:若内存单元中的数据为某个字符的ASCII码,则会在该部分显示出
相应的字符,所以我们看到了1975,1976等年份.而对于内存中属
于...
'1975',内存中存放的并不是1975本身,而是与字符'1','9','7',
'5'分别对应的ASCII码31,39,37,35,每个字符占一个字节.而对于
数据如0010H,在内存中存放的为其本身.
用-d 命令可查看某段内存中的内容.如-d 3000:0 这里显示了三部分
内容:
左边:每行行首内存单元的地址
中间:相应内存单元存放的数据
右边:若内存单元中的数据为某个字符的ASCII码,则会在该部分显示出
相应的字符,所以我们看到了1975,1976等年份.而对于内存中属
于...
阅读全文 |
评论次数(0) |
浏览次数(346) |
所属类型(默认类型)
[2009-05-24 17:52] 王爽<<汇编语言>>实验6(2)
本实验用[bx+si+idata]这种寻址方式定位要访问的数据,bx定位行,
si定位列,idata 为相对于行首的偏移地址,这里idata的值为3.
虽然很简单,但也要仔细认真.
大家一起加油啊
assume cs:code,ss:stack,ds:data
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
data segment
db '1. display '
db '2. brows '
db '3. replace '
db '...
si定位列,idata 为相对于行首的偏移地址,这里idata的值为3.
虽然很简单,但也要仔细认真.
大家一起加油啊
assume cs:code,ss:stack,ds:data
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
data segment
db '1. display '
db '2. brows '
db '3. replace '
db '...
阅读全文 |
评论次数(0) |
浏览次数(323) |
所属类型(默认类型)
[2009-05-22 20:03] 王爽<<汇编语言>>实验5(6)
初始化栈顶元素时注意sp的设置,实验虽然简单,
但也要认真
assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,9,0aH,0bH,0cH,0dH,0eH,0fH,0ffH
a ends
b segment
dw 0,0,0,0,0,0,0,0
c segment
code segment
start: mov ax,a
mov ds,ax
mov ax,b
mov ss,ax
mov sp,10H ...
但也要认真
assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,9,0aH,0bH,0cH,0dH,0eH,0fH,0ffH
a ends
b segment
dw 0,0,0,0,0,0,0,0
c segment
code segment
start: mov ax,a
mov ds,ax
mov ax,b
mov ss,ax
mov sp,10H ...
阅读全文 |
评论次数(0) |
浏览次数(298) |
所属类型(默认类型)
『 查看更多文章 』