实验10.3大佬来看看为啥没有显示
本帖最后由 LPY0204 于 2022-12-31 14:22 编辑assume cs:code ;将data段内字符串显示在屏幕指定位置
data segment
db 10 dup(0)
data ends
code segment
start: mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov si,0
mov dh,8 ;定义显示在屏幕第8行
mov dl,3 ;定义显示在屏幕第3列
mov cl,2 ;定义显示为绿色字
call show
mov ax,4c00h
int 21h
dtoc:
mov dl,10
s0:
div dl ;商存在al中,余数存在ah中
mov cl,al ;al给cl判断cx是否为0
add ah,30h
mov ,ah ;将余数存放到data中
jcxz ok1
inc si
jmp short s0
ok1:ret
show:
mov ax,0b800h; 把显存地址给es
mov es,ax
mov ax,160;显示每行为160字节
mul dh ;行数乘字节=整字节数
mov di,ax ;结果给di
mov ax,2 ;每字=两个字节去乘列数
mul dl;这里面是列数,结果乘完放在ax里
add di,ax;加上总字节数=偏移地址
mov bl,cl ;将cl值给bl便于下面比较cx是否为0
s:mov cl, ;把data段内的字符串给它
jcxz ok ;看cx是否为0,为0即跳转至ok处
mov es:,cl
mov es:,bl ;把绿色写在字节里
inc si
add di,2
jmp short s
ok:ret
code ends
end start 本帖最后由 人造人 于 2022-12-31 16:51 编辑
错的地方有点多
12666 / 10 等于多少?
等于1266,余数是6,没问题吧?
al寄存器最大可以存储0xff没问题吧?
1266是多少?
是0x4f2
al能放下这么大的数吗?
学汇编语言你要能用自己的大脑执行汇编指令
在你执行div dl之后是个什么情况?
用ax中的12666除以dl中的10,这会发生什么?
执行完这条指令的结果是什么?你不知道这条指令的执行结果,你怎么能写出这条指令呢?
只有你知道这条指令的结果,你才能写这条指令
是的,写程序不是 你写出程序,然后让计算机执行出结果
应该是 你先用自己的大脑写出程序,然后用自己的大脑执行出结果,然后再把程序用计算机写出来,然后用计算机执行
不要把顺序弄错了
还有jcxz,你在执行jcxz之前和之后,大脑中是个什么状态?
还有,除完之后的字符串是正序的还是反序的?
用你的大脑执行这些指令,这是学汇编语言必备的技能
另一个非常非常非常重要的是
把代码格式弄好,你自己看着舒服,别人看着也舒服
何乐而不为呢?
; 将data段内字符串显示在屏幕指定位置
assume cs:code
data segment
db 10 dup(0)
data ends
code segment
start:
mov ax, 12666
mov bx, data
mov ds, bx
mov si, 0
call dtoc
dec si
mov dh, 8 ; 定义显示在屏幕第8行
mov dl, 3 ; 定义显示在屏幕第3列
mov ch, 2 ; 定义显示为绿色字
call show
mov ax, 4c00h
int 21h
dtoc:
mov cx, 10
s0: xor dx, dx
div cx
add dx, '0'
mov , dl
inc si
cmp ax, 0
jne s0
ret
show:
mov ax, 0b800h ; 把显存地址给es
mov es, ax
mov al, 160 ; 显示每行为160字节
mul dh ; 行数乘字节=整字节数
mov di, ax ; 结果给di
mov al, 2 ; 每字=两个字节去乘列数
mul dl ; 这里面是列数,结果乘完放在ax里
add di, ax ; 加上总字节数=偏移地址
s:cmp si, 0ffffh
je ok
mov cl, ; 把data段内的字符串给它
dec si
mov es:, cx
add di, 2
jmp s
ok: ret
code ends
end start
本帖最后由 jackz007 于 2022-12-31 16:44 编辑
assume cs:code , ds:data
data segment para public 'DATA'
db 10 dup(0)
data ends
stack segment para stack 'STACK'
db 400h dup(0)
stack ends
code segment para public 'CODE'
dtoc proc near
cld
xor bx,bx
mov cx,10
d01: xor dx,dx
div cx
add dl,48
mov ,dl
or ax,ax
jz d02
inc bx
jmp short d01
d02: push bx
pop cx
shr cx,1
mov di,bx
add di,si
d03: mov al,
xchg ,al
mov ,al
inc si
dec di
loop d03
ret
dtoc endp
show proc near
push es
push cx
mov ax,0b800h
mov es,ax
mov al,160
mov cl,dh
mul cl
shl dl,1
xor dh,dh
add ax,dx
mov di,ax
s01: lodsb
or al,al
jz s02
stosb
pop ax
push ax
stosb
jmp short s01
s02: pop cx
pop es
ret
show endp
main proc far
mov ax,data
mov ds,ax
mov ax,12666
mov si,0
call dtoc
mov si,0
mov dh,8 ;定义显示在屏幕第8行
mov dl,3 ;定义显示在屏幕第3列
mov cl,2 ;定义显示为绿色字
call show
mov ax,4c00h
int 21h
main endp
code ends
end main 人造人 发表于 2022-12-31 15:54
错的地方有点多
12666 / 10 等于多少?
等于1266,余数是6,没问题吧?
感谢感谢!!! 人造人 发表于 2022-12-31 15:54
错的地方有点多
12666 / 10 等于多少?
等于1266,余数是6,没问题吧?
还有个问题就是第26行xor dx,dx为什么是必需的 LPY0204 发表于 2023-1-1 14:48
还有个问题就是第26行xor dx,dx为什么是必需的
你学div指令的时候应该学过吧?
http://c.biancheng.net/view/3606.html
LPY0204 发表于 2023-1-1 14:48
还有个问题就是第26行xor dx,dx为什么是必需的
8位的除法,被除数在AX中
16位的除法,被除数在DX:AX中
忘了?
人造人 发表于 2023-1-1 15:04
8位的除法,被除数在AX中
16位的除法,被除数在DX:AX中
忘了?
okk
页:
[1]