sub al,al zf=1 pf=1 sf=0
运算结果为0
—————————————————————
mov al,1 zf=1 pf=1 sf=0
不影响标志位
—————————————————————
push ax zf=1 pf=1 sf=0
不影响标志位
—————————————————————
pop bx zf=1 pf=1 sf=0
不影响标志位
—————————————————————
add al,bl zf=0 pf=0 sf=0
结果为2,(al)=0000 0...
- [游客] 感谢 11/15 22:10
- [游客] 把:DD 5937000,改成:DD 4294967295,你的错误,立刻就暴露出来。呵呵 05/19 18:30
- [游客] 计算人均时,是DD型除以DW型。把DD型的最大值代进去,你的程序,就溢出了。 05/19 18:28
- [游客] 注意不溢出的除法。 05/19 18:25
- [游客] 老师好啊~ 06/28 11:01
- [longphui] 谢谢 09/03 20:10
- [longphui] 谢谢 09/03 16:23
- [longphui] 谢谢 09/02 15:26
- [longphui] 谢谢 09/02 09:13
- [sissim] 恩恩,谢谢指正 01/11 18:24
- [even3] 亲,你好。。。这边有一个汇编语言程序,但是就是不知道哪里出了问题,问了很多人,都不知道想麻烦您一下, 05/16 20:48
- [mcjfo] 楼主可以帮我解决这个问题吗?谢谢! 为什么它会跳过JMP DD 指令不执行啊 小弟搞了好久抖没 06/08 06:50
[2010-02-11 22:43] 检测点11.1
阅读全文 |
评论次数(0) |
浏览次数(618) |
所属类型(汇编作业)
[2010-02-11 00:52] 课程设计1
放了这么久,真不应该。
一晚上,五个小时的时间,终于……
做这个课程设计,完全应用了自顶向下的编程方法。
这样思路很清晰。
这中间,发现了很多问题。
最主要的一个就是编写子程序时,对寄存器的保护做得不够,
以致于子程序不能很放心的直接拿来用。
很多时间,都是在跟踪哪个寄存器在哪个子程序中发生了改变。
assume cs:codesg
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db...
一晚上,五个小时的时间,终于……
做这个课程设计,完全应用了自顶向下的编程方法。
这样思路很清晰。
这中间,发现了很多问题。
最主要的一个就是编写子程序时,对寄存器的保护做得不够,
以致于子程序不能很放心的直接拿来用。
很多时间,都是在跟踪哪个寄存器在哪个子程序中发生了改变。
assume cs:codesg
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db...
阅读全文 |
评论次数(10) |
浏览次数(39884) |
所属类型(汇编作业)
[2009-11-22 10:01] 实验10 第3题
除法,要用32位除以16位,16位除以8位的话,会溢出。
余数存放下来,还要进行逆序操作。
assume cs:code
data segment
db 10 dup(0)
data ends
stack segment
db 16 dup(0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,1ah
mov ax,...
余数存放下来,还要进行逆序操作。
assume cs:code
data segment
db 10 dup(0)
data ends
stack segment
db 16 dup(0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,1ah
mov ax,...
阅读全文 |
评论次数(0) |
浏览次数(548) |
所属类型(汇编作业)
[2009-11-19 17:30] 实验10第2题
2.解决除法溢出的问题
这个公式着实费了番脑筋,int(H/N),是结果的高16位,后面第二个除法得到的结果,是X/N的第16位和余数。
程序如下:
assume cs:code
code segment
start: mov ax,4240h
mov dx,000fh
mov cx,0ah
call divdw
mov ax,4c00h
int 21h
divdw: mov bx,ax ;将数据低16位...
这个公式着实费了番脑筋,int(H/N),是结果的高16位,后面第二个除法得到的结果,是X/N的第16位和余数。
程序如下:
assume cs:code
code segment
start: mov ax,4240h
mov dx,000fh
mov cx,0ah
call divdw
mov ax,4c00h
int 21h
divdw: mov bx,ax ;将数据低16位...
阅读全文 |
评论次数(0) |
浏览次数(563) |
所属类型(汇编作业)
[2009-11-19 16:29] 实验10 第1题
1.显示字符串
做这个程序,出现了两个比较大的问题。总结如下:
第一,居然忘记设置段地址,直接将字符放到计算好的地址中,这样默认的段地址在ds中,导致屏幕无字符显示。
第二,一开始在ok标号处,直接就是ret指令,这是程序死循环。经过追踪程序,发现显示完字符串,取到0,转ok,这时ip又回到0002执行。这才意识到,执行ret之前,栈顶是刚才存入的cx的值,而不是返回地址(那一串push和pop是最后才加的)。
程序如下:
assume cs:code
data segment
db 'Welcome to masm!',...
做这个程序,出现了两个比较大的问题。总结如下:
第一,居然忘记设置段地址,直接将字符放到计算好的地址中,这样默认的段地址在ds中,导致屏幕无字符显示。
第二,一开始在ok标号处,直接就是ret指令,这是程序死循环。经过追踪程序,发现显示完字符串,取到0,转ok,这时ip又回到0002执行。这才意识到,执行ret之前,栈顶是刚才存入的cx的值,而不是返回地址(那一串push和pop是最后才加的)。
程序如下:
assume cs:code
data segment
db 'Welcome to masm!',...
阅读全文 |
评论次数(0) |
浏览次数(572) |
所属类型(汇编作业)
[2009-11-16 09:57] 检测点10.5
(1)call指令执行时,下一条指令的ea进栈,而call指令调用的正好是栈顶元素,所以程序顺序执行。执行后,ax=3。
可以用g命令执行验证结果,t命令涉及中断现场保护,会改变栈中的值。
H:\MYMASM>debug p195.exe
-u0 17
0CA7:0000 B8A60C MOV AX,0CA6
0CA7:0003 8ED0 MOV SS,AX
0CA7:0005 BC1000 MOV SP,0010
0CA7:0008 8ED8 MOV DS,AX
0CA7:000A...
可以用g命令执行验证结果,t命令涉及中断现场保护,会改变栈中的值。
H:\MYMASM>debug p195.exe
-u0 17
0CA7:0000 B8A60C MOV AX,0CA6
0CA7:0003 8ED0 MOV SS,AX
0CA7:0005 BC1000 MOV SP,0010
0CA7:0008 8ED8 MOV DS,AX
0CA7:000A...
阅读全文 |
评论次数(1) |
浏览次数(703) |
所属类型(汇编作业)
[2009-11-14 10:39] 检测点10.4
call指令执行时,0005h进栈,程序转到ea是6的位置执行。bp存放的是sp的值,[bp]隐含寻址的段地址就是ss中的数值,[bp]寻址的就是栈顶元素。所以ax=6+5=000bh。
程序调试如下:
-a1000:0
1000:0000 mov ax,6
1000:0003 call ax
1000:0005 inc ax
1000:0006 mov bp,sp
1000:0008 add ax,[bp]
1000:000B
-u0 8
1000:0000 B80600 MOV AX,0006
1000:0003 FFD0 ...
程序调试如下:
-a1000:0
1000:0000 mov ax,6
1000:0003 call ax
1000:0005 inc ax
1000:0006 mov bp,sp
1000:0008 add ax,[bp]
1000:000B
-u0 8
1000:0000 B80600 MOV AX,0006
1000:0003 FFD0 ...
阅读全文 |
评论次数(1) |
浏览次数(453) |
所属类型(汇编作业)
[2009-11-14 10:39] 检测点10.3
call时,sa和ea进栈,栈顶为0008h,下一个元素为1000h。s处,栈顶出栈到ax,则ax=0008h,加法之后,ax=0010h,再次pop,bx=1000h,ax、bx相加,结果为1010h。
调试如下:
-a 1000:0
1000:0000 mov ax,0
1000:0003 call far ptr 1000:9
1000:0008 inc ax
1000:0009 pop ax
1000:000A add ax,ax
1000:000C pop bx
1000:000D add ax,bx
1000:000F
-u1000:0 d
1000:000...
调试如下:
-a 1000:0
1000:0000 mov ax,0
1000:0003 call far ptr 1000:9
1000:0008 inc ax
1000:0009 pop ax
1000:000A add ax,ax
1000:000C pop bx
1000:000D add ax,bx
1000:000F
-u1000:0 d
1000:000...
阅读全文 |
评论次数(1) |
浏览次数(484) |
所属类型(汇编作业)
[2009-11-14 10:38] 检测点10.2
ax是栈顶元素出栈,其内容应该是call指令对当前ip的保存,也就是call指令后面第一个字节的地址。指令序列执行后,ax的值应该是0006h。
程序调试如下:
G:\MYMASM>debug
-a 1000:0
1000:0000 mov ax,0
1000:0003 call 7
1000:0006 inc ax
1000:0007 pop ax
1000:0008
-u 1000:0 0007
1000:0000 B80000 MOV AX,0000
1000:0003 E80100 CALL 0007
1000:0006...
程序调试如下:
G:\MYMASM>debug
-a 1000:0
1000:0000 mov ax,0
1000:0003 call 7
1000:0006 inc ax
1000:0007 pop ax
1000:0008
-u 1000:0 0007
1000:0000 B80000 MOV AX,0000
1000:0003 E80100 CALL 0007
1000:0006...
阅读全文 |
评论次数(1) |
浏览次数(432) |
所属类型(汇编作业)
[2009-11-13 14:35] 检测点10.1
段间转移时,高地址处为sa,低地址处为ea;先出栈的是ea,后出栈的是sa。
程序为:
assume cs:code
stack segment
db 16 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,1000h
push ax
mov ax,0
push ...
程序为:
assume cs:code
stack segment
db 16 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,1000h
push ax
mov ax,0
push ...
阅读全文 |
评论次数(1) |
浏览次数(550) |
所属类型(汇编作业)