|
主题 : : 课程设计1做出来了 有个疑问哪位高人帮忙解释下 附程序 [已解决] |
回复[ 3次 ]
点击[ 326次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-10-27 18:16 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2008-12-24 23:48 |
assume cs:code
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
;0-53h表示21年的21个字符串
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;表示21公司总输入 54h-a7h
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;表示21年公司员工人数的21个word型数据 a8h-d1h
data ends
code segment
start: mov ax,data
mov ds,ax
mov ax,0b800H
mov es,ax
mov bp,280H ;定位显存里的行数列数(5行0列)
mov si,0 ;指向ds:[0]
mov cx,21
s1: push cx ;cx值入栈
mov cx,4
s:
mov ah,0
mov al,[si] ;设置ds:[si]的ascll码给al
mov es:[bp],al ;al的ascll码放入显存中显示出来
inc bp
mov byte ptr es:[bp],0cah ;设置字的属性
inc bp
inc si
loop s
add bp,98H ;4个字符串占了8个字节(有4个字节是字的属性) 用a0h-8=98H,定位下一行
pop cx ;cx值出栈
loop s1
;到这里21个字符串显示出来了
;--------------------------------------------------------------------------------------
mov bp,280H ;定位显存里的行数列数(5行0列)
mov di,0
mov cx,21
s3: push cx
mov si,29H ;定位列,先设定字的属性在赋值字的ascll码 目的是求出来的余数从右往左排列
mov ax,ds:[di+54h]
mov dx,ds:[di+56h]
s4: mov cx,0ah ;设定除数
mov bx,ax
mov ax,dx
mov dx,0
div cx
push ax
mov ax,bx
div cx
add dl,30H
mov byte ptr es:[bp+si],0cah
dec si
mov es:[bp+si],dl
pop dx
mov cx,ax
jcxz s2
dec si
jmp short s4
s2: add bp,0a0h
add di,4
pop cx
loop s3
;到这里21个员工人数显示出来了
;---------------------------------------------------------
mov bp,280H ;定位显存里的行数列数(5行0列)
mov di,0
mov cx,21
s6: push cx
mov si,59H ;定位列,先设定字的属性在赋值字的ascll码 目的是求出来的余数从右往左排列
mov ax,ds:[di+0a8h]
s7: mov cx,0ah
mov dx,0
div cx
add dl,30H
mov byte ptr es:[bp+si],0cah
dec si
mov es:[bp+si],dl
mov cx,ax
jcxz s5
dec si
jmp short s7
s5: add bp,0a0h
add di,2
pop cx
loop s6
;到这里21个公司总收入显示出来了
;---------------------------------------------------------
mov bp,280H ;定位显存里的行数列数(5行0列)
mov di,0 ;年收入
mov bx,0 ;员工数据
mov cx,21
s10:push cx
push bx
mov si,79H ;定位列,先设定字的属性在赋值字的ascll码 目的是求出来的余数从右往左排列
mov ax,ds:[di+54h]
mov dx,ds:[di+56h]
div word ptr ds:[bx+0a8h] ;3条指令执行后ax保留除法的商
s9: mov cl,0ah
div cl ;执行后 ah=除法的余数 al=除法的商
add ah,30H ;余数+30h转换为十进制的ascll码
mov byte ptr es:[bp+si],0cah ;赋值字的属性
dec si
mov bx,0 ;mov bx,0 ????????
mov bl,ah ;mov bl,ah ????????
mov es:[bp+si],bl ;mov es:[bp+si],bl ??????
mov ah,0
mov cx,ax
jcxz s8
dec si
jmp short s9
s8: pop bx
add bp,0a0h
add di,4
add bx,2
pop cx
loop s10
;到这里21个人均收入显示出来了
;------------------------------------------------------------------------------
mov ax,4c00H
int 21H
code ends
end start
;打问号的3条指令为什么需要用bl中转下才可以用 如果直接调用ah就不对 比如把打问号的3条指令改成
mov es:[bp+si],ah 就不对了 请问为什么会这样? | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-10-29 10:49 ]
[引用]
[回复]
[ top ] | |
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48 |
;打问号的3条指令为什么需要用bl中转下才可以用 如果直接调用ah就不对 比如把打问号的3条指令改成
mov es:[bp+si],ah 就不对了 请问为什么会这样?
---------------
不会啊,mov es:[bp+si],ah和mov es:[bp+si],bl一样,都不会出现编译错误。
并且,mov es:[bp+si],ah和上面打问号的三天指令功能相同。
我改成mov es:[bp+si],ah后,编译运行了一下,结果没问题。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2009-11-02 00:41 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2008-12-24 23:48 |
刚刚把程序改了下 和你证实的一样可以运行 没错误 我写的时候调试就不对 我也单步跟踪查了 一用 mov es:[bp+si],ah指令ah的值就赋值不对 谢谢楼上的兄弟 | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-11-02 02:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2008-12-24 23:48 |
此贴由 贴主 于 [ 2009-11-02 02:03 ] 结贴。 结贴原因:问题已解决 | | |
|