汇编 实验10 的 第三个 进制转换显示
assume cs:codesgdata segment
db 10 dup(0)
data ends
codesg segment
start:
mov ax,12666
mov bx,data
mov ds,bx; 数据段
mov si,0
mov bx,0ah
mov cx,ax;通过ax是否为零来判断数字 是否转换完
call dtoc ;将数字转换为10进制
mov dh,8
mov dl,3
mov cl,2
call show_str ;放入显存
mov ax,4c00h
int 21h
dtoc:
div word ptr ;除以10
mov ,dl;余数放入 数据段
mov dx,0 ;清空余数
mov cx,ax;判断是否为0
jcxz ok
inc si ;数据段下一个位置
jmp short dtoc ;循环
ok:ret;为零结束
show_str:
mov al,2
mul dl
sub al,2
mov dl,al;dl 里存放列偏移
mov al,0a0h
dec dh
mul dh ;al存放行偏移
add al,dl;ax存放 偏移
mov di,ax;di 存放显存偏移
mov dx,cx;dx存放字体样式
mov cx,5;循环次数
mov ax,0b800h
mov es,ax;显存
s:
mov al,ds: ;将数据拿出
add al,30h ;加30h
mov es:,al ;放入显存
mov es:,dl ;放入字体样式
add di,2 ;偏移加2
dec si ;数据下一个
loop s
ret
codesg ends
end start
debug 的时候可以结束 但没显示12666
直接运行会卡住
求大神解答
本帖最后由 ISHEEPI 于 2020-10-19 08:02 编辑
川建军 发表于 2020-10-18 21:22
为啥我的汇编通过不了,nasm和masm的区别很大吗
assume cs:codesg
data segment
db 10 dup(0)
data ends
codesg segment
start:
mov ax,12666
mov bx,data
mov ds,bx; 数据段
mov bx,20;
mov si,0
mov word ptr ,0ah
mov cx,ax;通过ax是否为零来判断数字 是否转换完
call dtoc ;将数字转换为10进制
mov dh,8
mov dl,3
mov cl,2
call show_str ;放入显存
mov ax,4c00h
int 21h
dtoc:
mov dx,0 ;清空余数
div word ptr ;除以10
mov ,dl;余数放入 数据段
mov cx,ax;判断是否为
jcxz ok
inc si ;数据段下一个位置
jmp short dtoc ;循环
ok:ret;为零结束
show_str:
mov al,2
mul dl
sub al,2
mov dl,al ;dl 里存放列偏移
mov al,0a0h;行偏移乘以160
dec dh
mul dh ;al存放行偏移
add al,dl ;ax存放 偏移
mov di,ax;di 存放显存偏移
mov dx,cx;dx存放字体样式
mov cx,5;循环次数
mov ax,0b800h
mov es,ax;显存
s:
mov al,ds: ;将数据拿出
add al,30h ;加30h
mov es:,al ;放入显存
mov es:,dl ;放入字体样式
add di,2 ;偏移加2
dec si ;数据下一个
loop s
ret
codesg ends
end start
这个是最后可以成功的 本帖最后由 xieglt 于 2020-10-12 10:11 编辑
assume cs:codesg
data segment
db 10 dup(0)
data ends
codesg segment
start:
mov ax,12666
mov bx,data
mov ds,bx ; 数据段
;12666先存个位的6,最后存万位的1,因此从后向前处理
mov si,10
MOV ,36 ;DOS输出结束符号
mov bx,0ah
call dtoc ;将数字转换为10进制
;调用DOS 9号功能输出字符串
mov ah,9
mov dx,si
int 21h ;
mov ax,4c00h
int 21h
dtoc:
dec si
;除法 dx:ax / bx 商进AX,余数进DX
xor dx,dx
div bx
;10进制数转换成ASCII码才能输出
add dl,30H
mov ,dl ;余数放入 数据段
test ax,ax
jz ok
jmp short dtoc ;循环
ok:ret ;为零结束
codesg ends
end start 本帖最后由 wtchou 于 2020-10-13 07:30 编辑
dtoc:
mov dx,0
div bx
mov ,dl
mov cx,ax
jcxz ok
inc si
jmp short dtoc
ok:ret
这部份改一下 wtchou 发表于 2020-10-12 13:13
dtoc:
mov dx,0
div bx
不好意思 改成你这样还是不行 不过还是很谢谢你
我已经找到问题了
我想用 ds:【bx】来做除数0ah , 但我上面没放进去 为啥我的汇编通过不了,nasm和masm的区别很大吗 ISHEEPI 发表于 2020-10-19 07:56
assume cs:codesg
data segment
nasm是不是没有assum伪指令啊 川建军 发表于 2020-10-19 13:25
nasm是不是没有assum伪指令啊
我没用过nasm 你可以查查两个的区别
页:
[1]