170417 汇编-除法防溢出和数值显示的子程序实操
2017-04-18 00:20
190 查看
1625-5 王子昂 总结《2017年4月17日》 【连续第198天总结】
A.
汇编语言 综合设计1
80%
B.
综合设计中的三个子程序进行了上机实验,不溢出除法进行的很顺利,除了刚开始写的时候由于公式里没说余数哪去了所以也没写
检查了一下公式,重新理解了余数的出现地点然后将其正确输出即可
代码:
assume cs:code
code segment
start: mov ax,4240H
mov dx,0FH
mov cx,0AH
call divdw
mov ax,4c00h
int 21h
divdw: mov bx,ax
mov ax,dx
mov dx,0
div cx
mov bp,ax
mov ax,bx
div cx
mov cx,dx
mov dx,bp
ret
code ends
end start
第三个子程序是数值显示,将int型数据(word)转换为char型(字符串)。
主要思路是将数据逐次除以10,商与对应字符的ASCII值有差30H的对应关系,因此可以依次得到余数然后转换为字符型存入
然而这种方法得到的字符串一定是逆序的,书上没有进行相关说明
我有两种想法:
一、预估长度,然后直接跳到指定字符串的末尾进行逆向输出;但是由于长度是无法提前知道的,并且程序中判断长度的方法是商是否为0;因此只能以最大长度做考虑,当给定数值小于最大长度(word型数据最大65535即5位)时,将会在前方补0,比较不合题意
二、开辟另一个区域进行中转,先逆向放入,再逆向一次放入指定字符串的内存区域。考虑一下使用栈会比较方便,直接进行push和pop即可。
于是考虑实现了第二种,代码如下:
assume cs:code,ds:data,ss:stack
data segment
dw 8 dup(0)
data ends
stack segment
db 32 dup (0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
mov ax,stack
mov ss,ax
mov sp,10H
mov ax,22666
;ax not equal one
mov dx,0
call dtoc
mov ax,4c00h
int 21h
dtoc: ;mov bp,2
mov bx,0
push bx
dtocl: mov bx,10
div bx
add dx,30H
push dx
mov cx,ax
jcxz go
mov dx,0
; inc bp
loop dtocl
go: pop [si]
mov cx,[si]
jcxz ok
add si,2
loop go
ok: ret
code ends
end start
:但是不知道为什么,当循环进行到最后一位'1'时,mov cx,ax一定会报错:
"The
NTVDM CPU has encountered an illegal instruction.
CS:0000 IP:0077 OP:f0 37 05 0e 02 chose'Close' to terminate the application"
查了一下,有说是栈太小了导致溢出,也有说是虚拟机的设置和DOS的连接问题。但是改了栈的大小也没有用╮(╯_╰)╭尝试更改了代码,仍然会报这个错,一直位于对cx的赋值命令中
修改ax的初值,即修改数据的第一位为非'1'时则不会报错。不知道怎么回事,明天看看综合设计
C.
明日计划
汇编语言
综合设计1
A.
汇编语言 综合设计1
80%
B.
综合设计中的三个子程序进行了上机实验,不溢出除法进行的很顺利,除了刚开始写的时候由于公式里没说余数哪去了所以也没写
检查了一下公式,重新理解了余数的出现地点然后将其正确输出即可
代码:
assume cs:code
code segment
start: mov ax,4240H
mov dx,0FH
mov cx,0AH
call divdw
mov ax,4c00h
int 21h
divdw: mov bx,ax
mov ax,dx
mov dx,0
div cx
mov bp,ax
mov ax,bx
div cx
mov cx,dx
mov dx,bp
ret
code ends
end start
第三个子程序是数值显示,将int型数据(word)转换为char型(字符串)。
主要思路是将数据逐次除以10,商与对应字符的ASCII值有差30H的对应关系,因此可以依次得到余数然后转换为字符型存入
然而这种方法得到的字符串一定是逆序的,书上没有进行相关说明
我有两种想法:
一、预估长度,然后直接跳到指定字符串的末尾进行逆向输出;但是由于长度是无法提前知道的,并且程序中判断长度的方法是商是否为0;因此只能以最大长度做考虑,当给定数值小于最大长度(word型数据最大65535即5位)时,将会在前方补0,比较不合题意
二、开辟另一个区域进行中转,先逆向放入,再逆向一次放入指定字符串的内存区域。考虑一下使用栈会比较方便,直接进行push和pop即可。
于是考虑实现了第二种,代码如下:
assume cs:code,ds:data,ss:stack
data segment
dw 8 dup(0)
data ends
stack segment
db 32 dup (0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
mov ax,stack
mov ss,ax
mov sp,10H
mov ax,22666
;ax not equal one
mov dx,0
call dtoc
mov ax,4c00h
int 21h
dtoc: ;mov bp,2
mov bx,0
push bx
dtocl: mov bx,10
div bx
add dx,30H
push dx
mov cx,ax
jcxz go
mov dx,0
; inc bp
loop dtocl
go: pop [si]
mov cx,[si]
jcxz ok
add si,2
loop go
ok: ret
code ends
end start
:但是不知道为什么,当循环进行到最后一位'1'时,mov cx,ax一定会报错:
"The
NTVDM CPU has encountered an illegal instruction.
CS:0000 IP:0077 OP:f0 37 05 0e 02 chose'Close' to terminate the application"
查了一下,有说是栈太小了导致溢出,也有说是虚拟机的设置和DOS的连接问题。但是改了栈的大小也没有用╮(╯_╰)╭尝试更改了代码,仍然会报这个错,一直位于对cx的赋值命令中
修改ax的初值,即修改数据的第一位为非'1'时则不会报错。不知道怎么回事,明天看看综合设计
C.
明日计划
汇编语言
综合设计1
相关文章推荐
- 170413 汇编-防溢出除法和数值转字符型的子程序
- [Hb-IX] 编写子程序(显示字符串、数值,除法溢出问题)
- 汇编语言 第三版 王爽 实验10-2 编写子程序 之 解决除法溢出问题 divdw
- 汇编语言数值显示 的子程序dtoc.asm
- 编写无溢出除法的汇编子程序
- 3.数值显示-汇编语言(王爽)-实验10 编写子程序
- 王爽《汇编语言》显示字符串、除法溢出、数值显示程序
- 2.解决除法溢出问题-汇编语言(王爽)-实验10 编写子程序
- 使用汇编语言解决除法溢出问题
- 编写解决除法溢出问题的子程序
- 汇编实验10-2 解决除法溢出的问题
- 一文读懂除法溢出-使用汇编重定向0号中端(除法错误中断,比如,执行div指令产生的除法溢出)
- 汇编中防止除法溢出
- 汇编语言:实验10 根据材料编程—2.解决除法溢出的问题
- 汇编-显示我放到AL中的数值
- 编写不会产生除法溢出的子程序
- 汇编语言 第三版 王爽 实验10-1 编写子程序 之 显示字符串
- 子程序解决除法溢出问题 基于8086汇编
- 汇编语言解决除法溢出问题的小程序
- 汇编中的除法溢出的解决